2012-03-11 21 views
6

मैंने this question से पहले पूछा जहां a solution प्रस्तुत किया गया था। जहां तक ​​सवाल का सवाल है, समाधान अब तक बढ़िया है, लेकिन अब मैं उलझन में हूं कि मैं वर्ग के के बाहर विधियों को कैसे परिभाषित करता हूं, मैं .inl फ़ाइल में विधियों को परिभाषित करना चाहता हूं। इस मामले में वाक्यविन्यास क्या होगा?टेम्पलेट पैरामीटर विधियों के साथ टेम्पलेट क्लास विधियों की परिभाषा टेम्पलेट पैरामीटर

बस स्पष्ट होना, एक टेम्पलेट वर्ग के लिए, विधि परिभाषा हो जाएगा:

template <typename T> 
struct Foo 
{ 
    Foo(); 
}; 

// C-tor definition 
template <typename T> 
Foo<T>::Foo() 
{ 
} 

मैं एक पैरामीटर के रूप में enable_if के साथ टेम्पलेट वर्ग के लिए तरीकों को कैसे परिभाषित करेंगे?

template <typename Policy, enable_if< is_base<BasePolicy, Policy>::value >::type > 
struct Foo 
{ 
  Foo(); 
}; 

// C-tor definition -- ??? 
+0

जैसा कि आप इसे इनलाइन परिभाषित करते हैं, वही होगा? समस्या क्या है? –

+0

@KerrekSB: मुझे वाक्यविन्यास के बारे में निश्चित नहीं है ... 'inl' फ़ाइल में कन्स्ट्रक्टर निकालने के मेरे वर्तमान प्रयासों के परिणामस्वरूप त्रुटि हुई: '{ctor}: Foo ' का सदस्य नहीं है। संरचना के भीतर इसे परिभाषित करना ठीक से संकलित करता है। – Samaursa

+1

मुझे लगता है कि समस्या यह है कि पहले पोस्ट किया गया "समाधान" वास्तव में एक समाधान नहीं है: आपको 'enable_if <...>' या 'enable_if_c <...>' से 'bool'' टाइप को निकालने की आवश्यकता है और इसे [डिफ़ॉल्ट के रूप में] एक टेम्पलेट पैरामीटर। एक बार ऐसा करने के बाद यह स्पष्ट हो जाता है कि लाइन परिभाषा कैसा दिखता है। –

उत्तर

9

यह दिखता से, आप इस की तर्ज पर कुछ करना चाहता हूँ उलझन में नहीं मिलता है, वहाँ एक है कई स्थानों पर बैठे void निहित।

+0

'is_base_of' सी ++ 11 है ... अंतर्निहित 'शून्य' के साथ तर्क भी एक सी ++ 11 संपत्ति है? मुझे वही त्रुटि मिल रही है जैसा कि मैंने अन्य टिप्पणियों में रखा है ('त्रुटि C2039: {ctor}: का सदस्य नहीं है ...') – Samaursa

7

यहाँ कैसे SFINAE वास्तव में आंशिक विशेषज्ञता के साथ काम कर सकते हैं:

template<typename T, typename Sfinae = void> 
struct Foo { 
    /* catch-all primary template */ 
    /* or e.g. leave undefined if you don't need it */ 
}; 

template<typename T> 
struct Foo<T, typename std::enable_if<std::is_base_of<BasePolicy, T>::value>::type> { 
    /* matches types derived from BasePolicy */ 
    Foo(); 
}; 

कि निर्माता के लिए परिभाषा तो awkwardly के साथ पेश किया जा सकता है:

template<typename T> 
Foo<T, typename std::enable_if<std::is_base_of<BasePolicy, T>::value>::type>::Foo() 
{ 
    /* Phew, we're there */ 
} 

अपने संकलक टेम्पलेट उपनाम (समर्थन करता है तो यह एक सी ++ 11 फीचर है) तो आप बहुत सारी वर्बोजिटिटी काट सकते हैं:

template<typename T> 
using EnableIfPolicy = typename std::enable_if<std::is_base_of<BasePolicy, T>::value>::type; 

// Somewhat nicer: 

template<typename T> 
struct Foo<T, EnableIfPolicy<T>> { 
    Foo(); 
}; 

template<typename T> 
Foo<T, EnableIfPolicy<T>>::Foo() {} 

नोट: आपका मूल उत्तर बूस्ट से यूटिलियों को संदर्भित करता है, जैसे boost::enable_if_c और boost::is_base_of। आप उपयोग कर रहे हैं के बजाय std::enable_if और std::is_base_of (जिसमें से सी ++ 11 हैं), तो उपयोग लग रहा है कि एक ::value से छुटकारा पाने का लाभ दिया है जो

typename boost::enable_if<boost::is_case_of<BasePolicy, T> >::type 

की तरह।

template <typename Policy, 
      typename = typename std::enable_if<std::is_base_of<BasePolicy, Policy>::value>::type > 
struct Foo; 

template <typename Policy> 
struct Foo<Policy> { 
    Foo(); 
}; 

template <typename Policy> 
Foo<Policy>::Foo() { 
} 

यह sneakily कुछ स्थानों में डिफ़ॉल्ट तर्क का लाभ लेता है:

+0

वाक्यविन्यास के लिए धन्यवाद। हालांकि, यह मेरे लिए काम नहीं कर रहा है :(... मुझे मिलता है: 'त्रुटि C2039: {ctor}: का सदस्य नहीं है ... ' – Samaursa

+0

@ सैमोरसा बहुत खेद है, मैंने जांच की है कि मेरा कंपाइलर स्निपेट स्वीकार करता है, लेकिन मुझे वास्तव में पता नहीं है कि वास्तव में इस तरह के आंशिक विशेषज्ञता के सदस्यों को संदर्भित करना संभव है। इसलिए मुझे नहीं पता कि आपके कंपाइलर की त्रुटि उचित है या नहीं। –

+0

आपका स्निपेट 'सी ++ 11' है हालांकि 'std :: enable_if' बनाम' बूस्ट :: enable_if' का उपयोग केवल एकमात्र चीज है। सुनिश्चित नहीं है कि मेरा कंपाइलर (वीसी ++ 2008) परिभाषा को अस्वीकार कर रहा है। – Samaursa

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