2016-03-31 13 views
7

Supponiamo di avere due classi Foo1<T> e Foo2<T>.Come dichiarare il parametro modello di modello

allora voglio creare una funzione bar che prende un riferimento a un std::vector<Foo1<T>> o ad una std::vector<Foo2<T>> ma sempre restituisce un std::vector<Foo1<T>>:

template<class T, class Y> std::vector<Foo1<T>> bar(std::vector<Y<T>>&)

Purtroppo ma il compilatore non piace il <Y<T>> po. Un modo per aggirare questo è fornire due sovraccarichi ma c'è un modo per sistemare quanto sopra così è corretto?

risposta

17

È necessario template template parameter:

template<class T, template <typename> class Y> 
std::vector<Foo1<T>> bar(std::vector<Y<T>>&) {} 
+0

Grazie. Sei un angelo! –

+2

A partire da C++ 14 'Y' può anche essere dichiarato con' typename' invece di solo 'class'. Il parametro 'T' può sempre essere dichiarato così. solo un po 'di coerenza sintattica aggiunta alla lingua. – emsr

+0

@emsr Mi piace usare 'class' esclusivamente all'interno delle parentesi' template', proprio per rendere più facile la ricerca di costrutti 'typename T :: type'. – TemplateRex