2012-11-30 16 views
5

Mam problem z szablonami szablonów i odliczaniem parametrów. Oto kod:Funkcje szablonów i odliczanie parametrów

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

Spodziewałem się, że zaakceptuje ona zarówno wartości l, jak i wartości r, ale działa tylko z wartościami r. Zasada zwijania "T & & & = T &" nie ma zastosowania w tym przypadku?

Oczywiście mógłbym zadeklarować także funkcję odniesienia lwartości, ale czyni ją mniej czytelną.

Jeśli pytasz, dlaczego potrzebuję tego, to użyj static_sersert, aby sprawdzić, czy T jest konkretną klasą. Jeśli jest to prostszy sposób, z chęcią zmienię swój kod, ale chciałbym się dowiedzieć, czy szablony szablonów mogą być używane w ten sposób.

Dzięki

Odpowiedz

2

przeciwieństwie typename T, które mogą być wywnioskowane za rodzaj odniesienia, template<typename> class T można wywnioskować tylko kiedykolwiek się szablonu klasy, więc T<U> zawsze wnioskować do typu obiektu.

można napisać funkcję matrycy na T następnie rozpakować rodzaj szablonu w 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, "!"); 
} 
Powiązane problemy