Ответ 1
template <int(*...F)(int, int)>
class A {
// ...
};
Предположим, что мы имеем класс
template <int(*F)(int, int)>
class A {
// ...
};
Он принимает функцию в качестве аргумента шаблона.
Теперь я хочу создать вариационный шаблон, который принимает функции в качестве параметров шаблона.
template <int(*F...)(int, int)> // this won't compile
template <int(*F)(int, int)...> // this won't compile either
Как это сделать правильно?
template <int(*...F)(int, int)>
class A {
// ...
};
Вы можете сделать
using Function_t = int(*)(int, int);
template <Function_t ... Fs> struct s{};
else, если вы не хотите использовать typedef
template <int(*...Fs)(int, int)> struct s{};
Примечание: вторая версия не может быть анонимной (требуется Fs
), так как для ИСО С++ 11 требуется объявление в скобках в виде имени.
Просто используйте F в качестве аргумента шаблона. Это не только позволяет вам использовать функцию как параметр, но и другие типы, которые реализуют оператор скобок. Эти классы называются функторами.
Синтаксис типа указателя функции раздражает. Итак, код вокруг него:
template<class T> using type=T;
template< type<int(int,int)>* ... Fs >
class A {
};