( Дополнительно: Непосредственно отвечая на ваш первый вопрос, вы также можете превратить template<class...T, T... t> void func() {}
в шаблон внутри шаблона. Это не работает в g ++ 4.6, но работает в clang 3.0, следовательно, мне понадобилось время, чтобы найти его.)
Поместите шаблон внутри шаблона:
template<class ... T>
struct func_types {
template <T ... t>
static void func_values() {
// This next line is just a demonstration, and
// would need to be changed for other types:
printf("%c %d\n", t...);
}
};
int main() {
func_types<char, int> :: func_values<'A', 10>();
}
Допустим ли шаблон внутри шаблона? Альтернативой является использование кортежей с func< tuple<char,int> , make_tuple('A',10) >
. Я думаю, что это выполнимо, но вам, возможно, придется свернуть свой собственный класс кортежей (кажется, что make_tuple не является constexpr
.
Наконец, вы можете реализовать шаблон Foo следующим образом:
template<typename Ret, typename ...Args>
struct Foo {
template< Ret (*func)(Args...)>
struct Bar {
template<typename T...>
Bar(T&&... args) {
cout << "executing the function gives: "
<< func(std::forward(args)...) << endl;
}
};
};
int main () {
Foo<size_t, const char*> :: Bar<strlen> test1("hi");
Foo<int, const char*, const char*> :: Bar<strcmp> test2("compare","these");
}
Этот последний код находится на ideone . Чтобы продемонстрировать, я реализовал конструктор для пересылки аргументов в функцию, которая является кодом в шаблон.