2012-11-30 28 views
5

मुझे टेम्पलेट टेम्पलेट्स और पैरामीटर कटौती के साथ कोई समस्या है। कोड यह रहा:टेम्पलेट टेम्पलेट फ़ंक्शन और पैरामीटर कटौती

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

मैं इस या तो lvalues ​​और rvalues ​​स्वीकार करने के लिए उम्मीद है, लेकिन केवल rvalues ​​साथ काम करता है। ढहने वाला नियम "टी & & & = टी &" इस मामले में लागू नहीं होता है?

स्वाभाविक रूप से मैं भी lvalue संदर्भ फ़ंक्शन घोषित कर सकता हूं, लेकिन कोड को कम पठनीय बनाता है।

यदि आप पूछ रहे हैं कि मुझे इसकी आवश्यकता क्यों है, तो यह जांचने के लिए एक static_assert का उपयोग करना है कि टी एक विशेष श्रेणी है। यदि ऐसा करने का एक आसान तरीका है तो मुझे अपना कोड बदलने में खुशी होगी, लेकिन मैं जानना चाहता हूं कि इस तरह टेम्पलेट टेम्पलेट उपयोग योग्य हैं या नहीं।

धन्यवाद

उत्तर

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