2014-04-09 20 views
8

उदाहरण के लिए मैं दो पैरामीटर पैकएक साथ दो पैरामीटर पैक का उपयोग कैसे करें?

template<class... Ts, int... Is> 
struct B 
{ 

}; 

int main() 
{ 
    B<int, double, 0, 1> b; // compile error here 
    return 0; 
} 

पाने के लिए किसी भी तरह से सही है के साथ नीचे के रूप में एक कोड है?

+3

बी बी केवल 2 प्रकार के पैरामीटर लेते हैं, फिर 'बी , intlist <0,1>> 'का उपयोग करें। –

+5

मुझे लगता है कि आप दो पैरामीटर पैक कहना चाहते हैं, दो भिन्न टेम्पलेट्स नहीं। – chris

+0

'बी <टाइपेलिस्ट , 0, 1> 'काम करना चाहिए। आपको केवल 'टाइपलिस्ट' को परिभाषित करने की आवश्यकता है जो केवल एक पंक्ति है। मेरा जवाब देखें – Nawaz

उत्तर

6

कि अनुमति नहीं है। आप यह कर सकते हैं, हालांकि:

template<typename ...> struct typelist {}; 

template<typename TypeList, int... Is> 
struct B;        //primary template. Only declaration! 

template<typename ... Ts, int ... Is> 
struct B<typelist<Ts...>, Is...>   //partial specialization 
{ 
    //here you know Ts... and Is... Use them! 
}; 

int main() 
{ 
    B<typelist<int, double>, 0, 1> b; 
    return 0; 
} 
+0

अच्छा। आपकी संरचना 'टाइपलिस्ट', मैं आमतौर पर इसे 'पैक' कहता हूं। – iavr

2

आप सहायक टेम्पलेट्स परिचय हो सकता है के प्रकार/पूर्णांकों सूचियों को पेश करने:

template<typename TList, typename IList> struct X; 

template< 
    template<typename ...> class TList, typename ...Ts, 
    template<int ...> class IList, int ...Is> 
struct X <TList<Ts...>, IList<Is...> > 
{ 

}; 

template<typename ...Ts> struct TList {}; 
template<int ...Is> struct IList {}; 

int main() 
{ 
    X<TList<int, double>, IList<0, 1> > x; 
    return 0; 
} 
+0

'IList' की आवश्यकता नहीं है अगर' TList' है। – Nawaz

+0

मुझे पता है, लेकिन यह मेरे लिए क्लीनर दिखता है। –

+0

जैसा कि मैंने इसे देखा, '' टेम्पलेट <टाइपनाम ...> क्लास टीएलआईस्ट, टाइपनाम ... टी "मुझे 'टाइपनाम टाइपलिस्ट' की तुलना में, मेरे लिए उलझन में दिखता है। : | ... लेकिन फिर मेरे पास मेरी पिछली टिप्पणी से कोई लेना देना नहीं है, क्योंकि इसे बेहतर बनाने के लिए इसे फिर से लिखा जा सकता है। – Nawaz

2

मुझे लगता है कि यह XY समस्या से पीड़ित है। अगर मैं अच्छी तरह से समझ गया हूं, तो आप जो भी चाहते हैं वह विभिन्न प्रकार की संख्याओं को पारित करना है।

आपको लगता है कि std::integral_constant का उपयोग कर कर सकता है:

template<typename... INTS> 
struct foo 
{ 
    ... 
}; 

template<typename T , T n> 
using number = std::integral_constant<T,n>; //An alias for less typing... 

foo<number<int,-1>,number<unsigned int,1>, /* etc */>; 

अगर thats तुम क्या नहीं करना चाहता, मैं typelist आंशिक-विशेषज्ञता दृष्टिकोण दूसरों सुझाव का प्रयोग करेंगे।

संबंधित मुद्दे