2012-11-30 19 views
5

Ich habe ein Problem mit Vorlage Vorlagen und Parameter Abzug. Hier ist der Code:Vorlage Vorlage Funktionen und Parameter Abzug

template<typename U, template<typename> class T> 
void test(T<U>&& t) 
{ 
    ... 
} 

Ich erwartete dies entweder lvalues ​​und rvalues ​​zu akzeptieren, aber nur mit rvalues. Die Kollabierungsregel "T & & & = T &" gilt in diesem Fall nicht?

Natürlich könnte ich auch die lvalue-Referenzfunktion deklarieren, macht aber den Code weniger lesbar.

Wenn Sie fragen, warum ich das brauche, ist eine static_assert zu verwenden, um zu überprüfen, ob T eine bestimmte Klasse ist. Wenn es einen einfacheren Weg gibt, werde ich gerne meinen Code ändern, aber ich würde gerne wissen, ob Template-Vorlagen auf diese Weise verwendbar sind.

Dank

Antwort

2

Im Gegensatz zu typename T, die abgeleitet werden können, ein Referenztyp sein, template<typename> class T kann immer nur eine Klassenvorlage sein, abgeleitet werden, so T<U> immer geschlossen auf einen Objekttyp.

Sie können Ihre Funktion als Templat auf T dann entpacken Sie den Vorlagentyp im static_assert schreiben:

template<typename T> struct is_particular_class: std::false_type {}; 
template<typename U> struct is_particular_class<ParticularClass<U>>: std::true_type {}; 

template<typename T> void test(T &&) { 
    static_assert(is_particular_class<std::remove_reference<T>::type>::value, "!"); 
} 
Verwandte Themen