स्कॉट मेयर्स ने अपनी अगली पुस्तक EC ++ 11 की सामग्री और स्थिति पोस्ट की । उन्होंने लिखा कि पुस्तक में एक आइटम " std::enable_if
फ़ंक्शन हस्ताक्षरों से बचें" हो सकता है ।
std::enable_if
फ़ंक्शन तर्क के रूप में, रिटर्न प्रकार के रूप में या क्लास टेम्पलेट या फ़ंक्शन टेम्पलेट पैरामीटर के रूप में अधिभार संकल्प से कार्यों या कक्षाओं को सशर्त रूप से हटाने के लिए उपयोग किया जा सकता है।
में इस सवाल सभी तीन समाधान दिखाई जाती हैं।
फ़ंक्शन पैरामीटर के रूप में:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
टेम्पलेट पैरामीटर के रूप में:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
वापसी प्रकार के रूप में:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- कौन सा समाधान पसंद किया जाना चाहिए और मुझे दूसरों से क्यों बचना चाहिए?
- किन मामलों में "
std::enable_if
फंक्शन सिग्नेचर से बचें " चिंताओं का उपयोग रिटर्न प्रकार के रूप में किया जाता है (जो सामान्य फ़ंक्शन सिग्नेचर का हिस्सा नहीं है, लेकिन टेम्प्लेट स्पेशलाइज़ेशन का है)? - क्या सदस्य और गैर-सदस्य फ़ंक्शन टेम्पलेट के लिए कोई अंतर हैं?
std::enable_if
मेरी समारोह हस्ताक्षर (विशेष रूप से बदसूरत अतिरिक्त अस्त-व्यस्त करे nullptr
समारोह तर्क संस्करण), क्योंकि यह हमेशा (कुछ एक के लिए यह क्या है की तरह लग रहा है, एक अजीब हैक static if
हो सकता है इंटररेजिंग लैंग्वेज फीचर का फायदा उठाने के लिए टेम्प्लेट ब्लैक-मैजिक का उपयोग करके बहुत अधिक सुंदर और साफ) करते हैं। यही कारण है कि जब भी संभव हो मैं टैग-प्रेषण को प्राथमिकता देता हूं (ठीक है, आपके पास अभी भी अतिरिक्त अजीब तर्क हैं, लेकिन सार्वजनिक इंटरफ़ेस में नहीं और बहुत कम बदसूरत और गूढ़ हैं )।
=0
में typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
पूरा? मुझे इसे समझने के लिए सही संसाधन नहीं मिले। मुझे पता है कि पहले भाग =0
में एक सदस्य प्रकार है int
अगर U
और int
समान है। बहुत धन्यवाद!