कुछ आकार या रूप में std::enable_if
का उपयोग करने के लिए ऐसा करने का तरीका। समर्थित प्रकार के लिए चयनकर्ता को फिर रिटर्न प्रकार के रूप में उपयोग किया जाता है। उदाहरण के लिए:
template <typename T> struct is_supported { enum { value = false }; };
template <> struct is_supported<int> { enum { value = true }; };
template <> struct is_supported<float> { enum { value = true }; };
template <> struct is_supported<double> { enum { value = true }; };
template <typename T>
typename std::enable_if<is_supported<T>::value, T>::type
restricted_template(T const& value) {
return value;
}
जाहिर है, आप is_supported
से लक्षण एक बेहतर नाम देना चाहते हैं। std::enable_if
सी ++ 2011 का हिस्सा है लेकिन यह आसानी से लागू किया गया है या boost से प्राप्त किया गया है यदि यह आपके द्वारा उपयोग की जा रही मानक लाइब्रेरी के साथ उपलब्ध नहीं है।
सामान्य रूप से, स्पष्ट प्रतिबंधों को लागू करने के लिए अक्सर अनावश्यक होता है क्योंकि टेम्पलेट कार्यान्वयन में आम तौर पर निहित प्रतिबंध होते हैं। हालांकि, कभी-कभी यह कुछ प्रकारों को अक्षम या सक्षम करने में मददगार होता है।
स्रोत
2011-12-29 18:14:48
जहां तक मुझे पता है, सी ++ में भी सी ++ 11 में नहीं, लेकिन अवधारणाओं से संबंधित पुरानी हटाई गई विशेषताएं जो आपको अच्छी तरह याद हैं, वही करते हैं। – Geoffroy
@Geoffroy: इसके लिए कोई कोर भाषा स्तर का समर्थन नहीं है लेकिन enable_if का उपयोग करके किया जा सकता है (मेरा जवाब देखें)। यह थोड़ा बोझिल हो सकता है लेकिन मैं कुछ सहायक प्रकारों की कल्पना कर सकता हूं जो भिन्नता वाले टेम्पलेट्स का उपयोग करके सी ++ 2011 में इस अच्छे सिंटैक्स को दे सकते हैं (मैंने अभी तक इसका प्रयोग नहीं किया है)। –
क्या आप समर्थित प्रकारों के लिए एक ही परिभाषा लागू करना चाहते हैं, या क्या आपको इसे प्रत्येक के लिए अलग-अलग परिभाषित करने की आवश्यकता है? यानी 'f' '' के समान शरीर है? –