मैं आमतौर पर अपने वर्गों और टेम्पलेट्स की घोषणा करता हूं, और फिर उनके तरीकों को परिभाषित करता हूं (बिल्कुल उसी हेडर फ़ाइल में)। मुझे बस उस तरह से पढ़ने में आसान लगता है। खैर, मैं ऐसे मामले में आया हूं जहां मैं कक्षा के बाहर की परिभाषा में उपयोग करने के लिए एक कामकाजी प्रकार हस्ताक्षर नहीं समझ सकता। यहाँ मैं क्या कर रहा हूं की एक सरल उदाहरण है, कि समस्या दिखाता है:एक सक्षम_ifed टेम्पलेट टेम्पलेट कन्स्ट्रक्टर का प्रकार हस्ताक्षर?
template <class T>
struct Foo
{
Foo(T a, T b);
template
< class Iterator
, enable_if< is_iterator<Iterator> >
>
Foo
(Iterator first
, Iterator last
);
};
template <class T>
Foo<T>::Foo(T a, T b)
{ ... }
template <class T>
template
< class U
, WHAT_GOES_HERE?
>
Foo<T>::Foo(U f, U l)
{ ... }
मैं उससे मिलते-जुलते हस्ताक्षर प्राप्त करने की कोशिश करने के लिए WHAT_GOES_HERE
स्लॉट में चीजों के एक नंबर की कोशिश की है, और मैं बार-बार विफल। मुझे उस मामले को अलग करने के लिए enable_if की आवश्यकता है जहां कोई टाइप टी के दो ऑब्जेक्ट्स में गुजरता है, और जब कोई इटरेटर की एक जोड़ी में गुजरता है। कोड टेम्पलेट कन्स्ट्रक्टर को मुख्य टेम्पलेट के अंदर परिभाषित किया गया है, तो कोड ठीक काम करता है, इस प्रकार कोड वर्तमान में यह कैसे करता है, लेकिन मैं घोषणा के बाहर परिभाषा को अधिक स्थानांतरित करता हूं।
संपादित करें: मैं, < enable_if उल्लेख करना चाहिए कि मैं सिर्फ नहीं कर सकते फिर से उपयोग ...> परिभाषा क्योंकि enable_if < ...> अपने प्रकार है, जो आप में ऐसा नहीं कर सकते के लिए एक डिफ़ॉल्ट मान प्रदान करती है एक परिभाषा जो एक घोषणा भी नहीं है।
आप वास्तव में इस के लिए SFINAE की ज़रूरत है? यदि आप दूसरे कन्स्ट्रक्टर को 'टेम्पलेट फू (यू पहले, यू अंतिम) के रूप में घोषित करते हैं;', पहले कन्स्ट्रक्टर का चयन तब भी किया जाएगा जब कॉलर टाइप की दो ऑब्जेक्ट्स 'टी' पास करता है। –
टाइप टी आमतौर पर एक अंकगणितीय प्रकार होता है, और जब मैं टी हस्ताक्षरित होता है और इसके विपरीत, और टेम्पलेट कन्स्ट्रक्टर को कॉल नहीं किया जाता है (जो मैं सक्षम_आईफ़ का उपयोग करने से पहले हो रहा था) – swestrup
असल में, मैं इंट में गुजरने में सक्षम होना चाहता हूं, आप बिल्कुल डिफ़ॉल्ट मान निर्दिष्ट नहीं कर रहे हैं। आपके टेम्पलेट के लिए दूसरा पैरामीटर एक 'enable_if> 'है। अगर आपको 'int' की उम्मीद है तो पसंद करें। इसे संकलित नहीं करना चाहिए और निश्चित रूप से उपयोग करना असंभव होगा। –