2013-05-21 5 views
11

क्या डमी खाली प्रकार के उपयोग किए बिना टेम्पलेट स्थिति के आधार पर सदस्य चर घोषित करना या नहीं करना संभव है?सदस्य घोषित करना या टेम्पलेट पैरामीटर के आधार पर नहीं

उदाहरण:

struct empty{}; 
struct real_type{}; 

template<bool condition> 
struct foo 
{ 
    typename std::conditional<condition, real_type, empty>::type _member; 
}; 

उत्तर

11

आप एक विशेषज्ञता है कि एक टेम्पलेट से निकाले जाते हैं कर सकते हैं:

struct real_type { }; 

template<bool c> 
struct foo_base { }; 

template<> 
struct foo_base<true> 
{ 
    real_type _member; 
}; 

template<bool condition> 
struct foo : foo_base<condition> 
{ 
}; 

एक छोटे से परीक्षण के रूप में:

int main() 
{ 
    foo<true> t; 
    t._member.x = 42; // OK 

    foo<false> f; 
    f._member.x = 42; // ERROR! No _member exists 
} 
+0

@MikeSeymour: ठीक है, बचे हुए :) धन्यवाद, संपादित –

+0

वाह! इस स्थिति में मेरी कक्षा में "खाली" structs नहीं होंगे जब स्थिति झूठी – Felics

+0

@ फ़ेलिक्स: हाँ, यह सही है –

0

यह घोषणा करने के लिए संभव है या डमी का उपयोग किए बिना टेम्पलेट स्थिति के आधार पर सदस्य चर नहीं खाली प्रकार?

मेरा मानना ​​है कि आप भी specialize बिना व्युत्पत्ति कर सकते हैं। यह -std=c++03 और -std=c++11 दोनों के तहत ठीक से परीक्षण किया गया।

template<bool condition> 
struct foo; 

template<> 
struct foo<true> 
{ 
    real_type _member; 
}; 

template<> 
struct foo<false> 
{ 
}; 

यह सुनिश्चित करें कि अच्छा हो गया होता यदि सी ++ समिति ने हमें दिया है कि हम क्या चाहते थे/जरूरत:

template<bool condition> 
struct foo 
{ 
#if (condition == true) 
    real_type _member; 
#endif 
}; 
संबंधित मुद्दे