/ / Funktionen als Argumente für variadische Templates - C ++, Templates, Variadic-Templates

Funktionen als Argumente von variadischen Vorlagen - C ++, Templates, Variadic-Templates

Angenommen, wir haben eine Klasse

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

Es benötigt eine Funktion als Vorlagenargument.

Nun möchte ich eine variadische Vorlage erstellen, die Funktionen als Vorlagenparameter übernimmt.

template <int(*F...)(int, int)> // this won"t compile
template <int(*F)(int, int)...> // this won"t compile either

Wie mache ich das richtig?

Antworten:

12 für die Antwort № 1
template <int(*...F)(int, int)>
class A {
// ...
};

18 für die Antwort № 2

Sie können es tun

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

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

Andernfalls, wenn Sie kein typedef verwenden möchten

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

Hinweis: Die zweite Version darf nicht anonym sein (Fs ist erforderlich), da ISO C ++ 11 eine Klammerdeklaration benötigt, um einen Namen zu erhalten.


3 für die Antwort № 3

Verwenden Sie einfach F als Vorlagenargument. Dadurch können Sie nicht nur die Funktion als Parameter verwenden, sondern auch andere Typen, die den Klammeroperator implementieren. Diese Klassen werden aufgerufen Funktoren.


2 für die Antwort № 4

Die Syntax der Funktionszeigertypen ist ärgerlich. Also Code um ihn herum:

template<class T> using type=T;

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