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 № 1template <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 {
};