2012-11-30 178 views
5

我遇到了模板模板和參數扣除的問題。這裏的代碼:模板模板函數和參數扣除

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

我期望這接受左值和右值,但只適用於rvalues。摺疊規則「T & & & = T &」在這種情況下不適用?

當然,我也可以聲明左值引用函數,但會使代碼更不可讀。

如果你問我爲什麼需要這個是使用static_assert來檢查是否T是一個特定的類。如果有更簡單的方法可以這樣做,我會很樂意更改我的代碼,但我想知道模板模板是否可用於此方式。

由於

回答

2

不同於typename T,其可以被推導爲引用類型,template<typename> class T永遠只能推斷爲類模板,所以T<U>總是推斷的對象類型。

你可以寫你的函數模板上T然後解壓縮到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, "!"); 
}