2012-08-24 24 views
17

निम्नलिखित कोड पर विचार करें:टेम्पलेट पैरामीटर के साथ डेटा सदस्यों को जोड़ें/निकालें?

template<bool AddMembers> class MyClass 
{ 
    public: 
     void myFunction(); 
     template<class = typename std::enable_if<AddMembers>::type> void addedFunction(); 

    protected: 
     double myVariable; 
     /* SOMETHING */ addedVariable; 
}; 

इस कोड में, टेम्पलेट पैरामीटर AddMembers जब यह true है वर्ग के लिए एक समारोह को जोड़ने के लिए अनुमति देते हैं। ऐसा करने के लिए, हम std::enable_if का उपयोग करते हैं।

मेरा प्रश्न है: डेटा सदस्यों के लिए एक ही संभव है (शायद एक चाल के साथ)? बंद

struct BaseWithVariable { int addedVariable; }; 
struct BaseWithoutVariable { }; 

template <bool AddMembers> class MyClass 
    : std::conditional<AddMembers, BaseWithVariable, BaseWithoutVariable>::type 
{ 
    // etc. 
}; 

उत्तर

21

सशर्त आधार वर्ग में इस्तेमाल किया जा सकता है? ।। अपने कोड सिर्फ MyClass<false> के लिए संकलन नहीं होगा enable_if विशेषता निष्कर्ष निकाला तर्क के लिए उपयोगी है, वर्ग टेम्पलेट तर्क के लिए नहीं

दूसरा, आपके द्वारा सदस्यों को नियंत्रित कर सकते हैं:

template <bool> struct Members { }; 

template <> struct Members<true> { int x; }; 

template <bool B> struct Foo : Members<B> 
{ 
    double y; 
}; 
16

पहले,: (इस तरह से MyClass<false> 1 डेटा सदस्य है कि (myVariable) और MyClass<true> 2 डेटा सदस्यों (myVariable और addedVariable होगा)

+0

+++++ 1 सही! सशर्त टेम्पलेट पैरामीटर के साथ मिक्सिन – Viet