Подтвердить что ты не робот

Функции как аргументы вариационных шаблонов

Предположим, что мы имеем класс

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

Как это сделать правильно?

4b9b3361

Ответ 1

template <int(*...F)(int, int)>
class A {
    // ...
};

Ответ 2

Вы можете сделать

using Function_t = int(*)(int, int);

template <Function_t ... Fs> struct s{};

else, если вы не хотите использовать typedef

template <int(*...Fs)(int, int)> struct s{};

Примечание: вторая версия не может быть анонимной (требуется Fs), так как для ИСО С++ 11 требуется объявление в скобках в виде имени.

Ответ 3

Просто используйте F в качестве аргумента шаблона. Это не только позволяет вам использовать функцию как параметр, но и другие типы, которые реализуют оператор скобок. Эти классы называются функторами.

Ответ 4

Синтаксис типа указателя функции раздражает. Итак, код вокруг него:

template<class T> using type=T;

template< type<int(int,int)>* ... Fs >
class A {
};