अतीत में निर्माता भार के चयन करने के लिए SFINAE का उपयोग कर, मैं आम तौर पर निम्न का इस्तेमाल किया है:SFINAE काम के लिए इलिप्स का उपयोग कैसे करता है?
template <typename T>
class Class {
public:
template <typename U = T, typename std::enable_if<std::is_void<U>::value, int>::type=0>
Class() {
std::cout << "void" << std::endl;
}
template <typename U = T, typename std::enable_if<!std::is_void<U>::value, int>::type=0>
Class() {
std::cout << "not void" << std::endl;
}
};
हालांकि, मैं सिर्फ इस विकल्प भर में आया था:
template <typename U = T, typename std::enable_if<std::is_void<U>::value>::type...>
Class() {
std::cout << "void" << std::endl;
}
यह देखते हुए कि निम्नलिखित गैर कानूनी है। ..
template <typename U = T, void...> // ERROR!
Class() { }
... गैर-प्रकार के टेम्पलेट तर्क के बजाए लंबवत विकल्प का उपयोग कैसे किया जाता है?
पूर्ण कोड: http://coliru.stacked-crooked.com/a/64a1aaf13ce6099b
@peppe लेकिन 'टेम्पलेट <टाइपनाम यू = टी, शून्य>' अवैध भी है। क्या किसी प्रकार पैरामीटर के लिए डिफ़ॉल्ट तर्क के रूप में 'शून्य' का उपयोग करने की आवश्यकता नहीं होगी? जैसा कि, 'टेम्पलेट <टाइपनाम यू = टी, टाइपनाम वी = std :: enable_if <...> :: टाइप> '? – zennehoy
@peppe टेम्पलेट के रूप में * प्रकार * पैरामीटर, टेम्पलेट गैर-प्रकार पैरामीटर के रूप में नहीं। – Barry
@ बैरी: IOW 'टेम्पलेट :: टाइप>' गैरकानूनी है क्योंकि यह 'शून्य' को कम करेगा यदि 'शर्त 'सत्य है, क्योंकि यह एक गैर-प्रकार पैरामीटर है, जबकि' टेम्पलेट :: type> 'कानूनी है? –
peppe