2013-02-12 21 views
6

मैं यह करने के कोशिश कर रहा हूँ:सशर्त (SFINAE) ओवरराइड

struct A 
{ 
    virtual int f() const { return 0; } 
}; 

template <typename T> 
struct B : A 
{ 
    template <typename U = T, 
    typename std::enable_if<...some condition involving U...>::type> 
    int f() const { return 1; } 
}; 

चेतावनी, मैं वारिस नहीं कर सकते वर्ग टेम्पलेट्स (स्थिर ओवरराइड उपयोग करें)। क्या इस तरह के निर्माण की अनुमति है और क्या टेम्पलेट सदस्य बी :: एफ() सदस्य ए :: एफ() को ओवरराइड कर सकता है?

उत्तर

6

इस प्रयास करें:

template <typename T, typename=void> 
struct B : A 
{ 
    ... 
}; 

temlate <typename T> 
struct B<T, typename std::enable_if<...some condition...>::type>: 
    A 
{ 
    virtual int f() const override { return 1; } 
}; 

जहाँ हम दो (enable_if एक) (डिफ़ॉल्ट एक) B<T> के संस्करणों, जिसके लिए शर्त सच है, जिनमें से एक के लिए हालत झूठी है।

आप अपने डिफ़ॉल्ट B कार्यान्वयन का पुन: उपयोग करने में सक्षम होना चाहते हैं तो आपके भी ऐसा कर सकता है:

template <typename T, typename=void> 
struct B : A 
{ 
    ... 
}; 

template <typename T> 
struct B<T, typename std::enable_if<...some condition...>::type>: 
    B<T, bool> 
{ 
    virtual int f() const override { return 1; } 
}; 

जहाँ हम "सही" मामले में "गलत" मामले से विरासत। लेकिन यह मेरे लिए थोड़ा गंदा है - मैं उस हैक की बजाय कुछ तीसरे स्थान (B_impl) में सामान्य कार्यान्वयन करना चाहता हूं। (यह आपको स्थिर जोर देता है कि दूसरा तर्क voidB के पहले मामले में है)।

+0

अद्भुत विचार, पूरी तरह से काम करता है। – user1095108

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