2010-12-28 5 views
20
struct Bar { 
    enum { Special = 4 }; 
}; 

template<class T, int K> struct Foo {}; 
template<class T> struct Foo<T,T::Special> {}; 

उपयोग:क्या सदस्य एनम का उपयोग करके टेम्पलेट का विशेषज्ञ बनाना संभव है?

Foo<Bar> aa; 

जीसीसी 4.1.2 यह फू का आंशिक specilization के लिए T::Special के उपयोग के बारे में शिकायत का उपयोग कर संकलित करने के लिए विफल रहता है। यदि Special एक वर्ग था तो समाधान इसके सामने एक टाइपनाम के लिए होगा। क्या एनम्स (या पूर्णांक) के लिए इसके बराबर कुछ है?

+6

एक दिलचस्प सवाल है। –

+0

यदि आप एक ठोस पूर्णांक (99, कहें) के साथ टी :: स्पेशल को प्रतिस्थापित करते हैं, तो यह अभी भी g ++ 4.4.0 के तहत संकलित नहीं होता है: 'टेम्पलेट तर्कों की गलत संख्या (1, 2 होना चाहिए)। मुझे एहसास है कि यह एक है अलग मुद्दा, लेकिन संकलक इसे स्वीकार नहीं करना चाहिए? – TonyK

उत्तर

9

गैर-प्रकार के टेम्पलेट तर्क का प्रकार आंशिक विशेषज्ञता के टेम्पलेट पैरामीटर पर निर्भर नहीं हो सकता है।

आईएसओ सी ++ 03 14.5.4/9 कहते हैं

एक आंशिक रूप से विशेष गैर प्रकार तर्क अभिव्यक्ति जब तर्क अभिव्यक्ति एक सरल पहचानकर्ता है सिवाय आंशिक विशेषज्ञता के टेम्पलेट पैरामीटर शामिल नहीं होगा।

template <int I, int J> struct A {}; 
template <int I> struct A<I+5, I*2> {}; //error 
template <int I, int J> struct B {}; 
template <int I> struct B<I, I> {};  //OK 

तो कुछ इस तरह अवैध template<class T> struct Foo<T,T::Special> {}; क्योंकि T::SpecialT

पर निर्भर करता है के उपयोग में भी अवैध है। आपने एक टेम्पलेट तर्क प्रदान किया है लेकिन आपको दो प्रदान करने की आवश्यकता है।

+1

गैर-प्रकार टेम्पलेट पैरामीटर का प्रकार आंशिक विशेषज्ञता के टेम्पलेट पैरामीटर पर क्यों निर्भर करता है? प्रकार अभी भी 'int' है, नहीं? –

+0

मैं टेम्पलेट तर्क के बारे में बात कर रहा हूं (टेम्पलेट पैरामीटर 'int K' के बारे में नहीं) 'टी :: स्पेशल' जो' टी' पर निर्भर करता है। –

+0

आह। तर्क का प्रकार 'टी' पर निर्भर है, पैरामीटर का प्रकार' int' है। –

16

कि के बाद से, प्रसून द्वारा सी ++ explained रूप से अनुमति नहीं है तो कोई वैकल्पिक समाधान ideone पर EnumToType वर्ग टेम्पलेट,

struct Bar { 
    enum { Special = 4 }; 
}; 

template<int e> 
struct EnumToType 
{ 
    static const int value = e; 
}; 

template<class T, class K> //note I changed from "int K" to "class K" 
struct Foo 
{}; 

template<class T> 
struct Foo<T, EnumToType<(int)T::Special> > 
{ 
    static const int enumValue = T::Special; 
}; 

नमूना कोड का उपयोग करने के होगा: http://www.ideone.com/JPvZy


या, आप बस इस तरह विशेषज्ञ हो सकते हैं (यदि यह आपकी समस्या हल करता है),

template<class T> struct Foo<T,Bar::Special> {}; 

//usage 
Foo<Bar, Bar::Special> f; 
+3

बहुत अच्छा समाधान! –

+1

वास्तव में एक अच्छा समाधान है। मुझसे +1 :) –

+0

@ जेम्स और प्रसून: सराहना के लिए धन्यवाद :-) – Nawaz