2012-11-30 18 views
5

Ho un problema con i modelli di modello e la deduzione dei parametri. Ecco il codice:Detrazione funzioni e parametri modello template

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

Mi aspettavo questo per accettare lvalue e rvalues, ma funziona solo con rvalues. La regola del collasso "T & & = T &" non si applica in questo caso?

Naturalmente potrei dichiarare anche la funzione di riferimento di lvalue, ma rende il codice meno leggibile.

Se stai chiedendo perché ho bisogno di questo è quello di utilizzare un static_assert per verificare se T è una classe particolare. Se c'è un modo più semplice per farlo, sarò felice di cambiare il mio codice, ma mi piacerebbe sapere se i modelli di template sono utilizzabili in questo modo.

Grazie

risposta

2

differenza typename T, che possono essere dedotte per essere un tipo di riferimento, template<typename> class T possono sempre e solo essere dedotti per essere un modello di classe, in modo da T<U> è sempre dedotta a un tipo di oggetto.

scrivi tu funzione templato su T poi scompattare il tipo di modello nella static_assert:

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, "!"); 
} 
Problemi correlati