У меня есть перечисление, назовем его Type. Он имеет значения как таковые:
enum Type { STRING, TYPE_A_INT, TYPE_B_INT};
Я хочу написать функцию Foo, которая может принимать произвольное количество значений типа {int, string}, но обеспечивать, чтобы параметры шаблона соответствовали типам параметров.
В идеале он будет вести себя так:
Foo<STRING, TYPE_A_INT>("str", 32); // works
Foo<STRING, TYPE_B_INT>("str", 32); // works
Foo<STRING, TYPE_B_INT, TYPE_A_INT, STRING>("str", 32, 28, "str"); // works
Foo<STRING, TYPE_B_INT>("str", "str"); // doesn't compile
Есть ли способ сделать это?
Кажется, я мог бы сделать что-то вроде следующего, но это не сработает, поскольку Args будет Type, а args будет {string, int}.
template<typename Arg, typename... Args>
std::enable_if<(std::is_same<Arg, STRING>::value)>
Foo(String arg, Args... args) {
// Do stuff to arg, then make recursive call.
Foo(args);
}
template<typename Arg, typename... Args>
std::enable_if<(std::is_same<Arg, TYPE_A_INT>::value)>
Foo(int arg, Args... args) {
// Do stuff to arg, then make recursive call.
Foo(args);
}
Я мог бы просто обернуть аргументы чем-то вроде
pair<Type, string>
pair<Type, int>
но было бы очень хорошо избежать этого.
Do stuff to arg
не будет ли ошибки компилятора, если тип все равно не будет работать? Зачем вам ограничивать его, если компилятор должен сделать это за вас? - person Kevin   schedule 11.11.2015static_assert
в функции шаблона, которая используетstd::is_same
для запроса одного из разрешенных типов? - person Olipro   schedule 11.11.2015