2014-10-09 26 views
17

Załóżmy, że mamy klasaFunkcje jako argumenty o zmiennej liczbie argumentów szablonów

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

Zajmuje funkcję jako szablon argumentu.

Teraz chcę utworzyć szablon variadic, który przyjmuje funkcje jako parametry szablonu.

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

Jak zrobić to poprawnie?

+1

Co dostałeś? – Useless

+2

Elipsa jest zawsze "tuż przed" nazwą, w tym przypadku 'F'. – leemes

Odpowiedz

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

Można zrobić

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

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

indziej, jeśli nie chcesz używać typedef

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

Uwaga: druga wersja nie może być anonimowy (Fs jest wymagane) jako ISO C++ 11 wymaga, aby deklaracja opakowania w nawiasach miała nazwę.

3

Po prostu użyj F jako argumentu szablonu. Umożliwia to nie tylko użycie funkcji jako parametru, ale także innych typów implementujących operator nawiasów. Klasy te nazywane są funktorów.

+4

Może to być mądra sugestia, ale nie rozwiązanie problemu. Należy również zauważyć, że tutaj same funkcje są parametrami szablonu, a nie tylko ich typem. W twoim przypadku typy funktora będą parametrami szablonu, ale (w zależności od miejsca, w którym są używane) musisz przekazać je jako argumenty funkcji. – leemes

2

Składnia wskaźnika funkcji funkcji jest denerwująca. Więc koduj go:

template<class T> using type=T; 

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

Chociaż interesujące, użycie różnych składni dla tych funkcji typu wygląda dziwnie IMHO. Może 'wskaźnik '? – dyp

+0

@dyp Chcę, aby rzeczy czytały od lewej do prawej jak "normalne" zmienne, a 'wskaźnik ' nie robi tego. – Yakk

+0

Cóż, możesz zacząć zadeklarować normalne zmienne w ten sposób: 'wskaźnik x; array f; referencja >>> s; ';) - hmm nazwane operatory? – dyp

Powiązane problemy