2011-05-20 13 views
5

मैं यह निर्धारित करना चाहता हूं कि कोई भिन्न वर्ग टेम्पलेट किसी अन्य वर्ग का आधार है या नहीं। आम तौर पर मैं std :: is_base_of का उपयोग करता हूं, लेकिन मुझे नहीं लगता कि मेरा उपयोग केस फिट बैठता है, और मुझे यकीन नहीं है कि एसडीडी में कुछ पहले से ही है या इसे संभालने के लिए बढ़ावा है। मैं वैरिएडिक बेस क्लास टेम्पलेट के पैरामीटर पैक को अन्य वैरिएडिक क्लास टेम्पलेट से आने के लिए चाहता हूं।विविधता टेम्पलेट पैरामीटर पैक निकालें और इसे किसी अन्य प्रकार के टेम्पलेट मेटा-फ़ंक्शन में किसी अन्य वैरिएड टेम्पलेट में उपयोग करें?

उपयोग::

is_variadic_base_of< 
    VarClassTemplA 
    , ClassDerivedFromA 
    , VarClassTemplB //Has param pack I want to use with ClassA 
>::value; 

हिम्मत:

//test for variadic base of non-variadic 
template <template<typename...> class A, typename B, typename... ArgsC> 
struct is_variadic_base_of 
: std::is_base_of<A<ArgsC...>, B> 
{}; 

इस संभव है यहां कुछ उदाहरण कोड उम्मीद है कि बताते हैं कि मुझे क्या करना चाहते है?

उत्तर

5
template <template<typename...> class A, typename B, typename ArgsC> 
struct is_variadic_base_of; 

template <template<typename...> class A, typename B, 
      template<typename...> class C, typename ...ArgsC> 
struct is_variadic_base_of<A, B, C<ArgsC...>> 
: std::is_base_of<A<ArgsC...>, B> 
{}; 

उम्मीद है कि यह मदद करता है!

+0

सुनिश्चित नहीं हैं कि यह कुछ भी बदल जाता है, लेकिन मैं 'VarTemplClassB ' करने के लिए एक छोटे से संपादित किया था, अब यह है बस 'VarTemplClassB'। –

+1

@ जोहान्स: बू, कुछ सेकंड! :( – Xeo

+0

लॉल, मुझे नहीं पता कि मैंने कितने क्रमिक प्रयास किए हैं और इस पर जमीन नहीं ली है। सही काम करता है। धन्यवाद! –

4

आप लगभग वहाँ हो, लेकिन एक आंशिक विशेषज्ञता के साथ प्रयास करें:

template< 
    template<class...> class A, class B, class C 
> 
struct is_variadic_base_of; 

// partial spec 
template< 
    template<class...> class A, class B, 
    template<class...> class C, class... ArgsC 
> 
struct is_variadic_base_of< A,B,C<ArgsC...> > 
    : std::is_base_of< A<ArgsC...>,B > 
{}; 
+0

ठीक है, मैंने कई चीजों की कोशिश की। अभी भी विशेषज्ञों के साथ चीजों को काटने का लटका नहीं है, लेकिन मैं वहां जा रहा हूं। तो peeps एक बड़ी मदद की गई है! –

+0

@pheedbaq: Fighto! ;) लेकिन मुझे स्वीकार करना होगा, यह आंशिक विशेषज्ञता सामान टीएमपी का एक हिस्सा है जो वास्तव में वास्तव में पसंद करता है, विशेष रूप से यह मिलान करने वाला पैटर्न सक्षम बनाता है। – Xeo

+0

वही है। किसी भी बदसूरत बतख वाक्यविन्यास के बावजूद, मैं उन चीजों पर हमेशा प्रभावित हूं जो टीएमपी कर सकते हैं। सिर्फ यह तथ्य कि इन चीजों को पहले स्थान पर किया जा सकता है, साथ ही भाषा के बाकी सब कुछ ... बहुत बढ़िया है। –

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