2011-12-29 16 views
5

संभव डुप्लिकेट:
C++ templates that accept only certain typesक्या हम केवल कुछ डेटा प्रकारों के लिए टेम्पलेट फ़ंक्शन को परिभाषित कर सकते हैं?

उदाहरण के लिए, अगर हम एक टेम्पलेट समारोह जो हम पूर्णांकों का उपयोग कर सकते परिभाषित करना चाहते हैं, तैरता है, डबल्स नहीं बल्कि तार। क्या ऐसा करने का कोई आसान तरीका है?

+0

जहां तक ​​मुझे पता है, सी ++ में भी सी ++ 11 में नहीं, लेकिन अवधारणाओं से संबंधित पुरानी हटाई गई विशेषताएं जो आपको अच्छी तरह याद हैं, वही करते हैं। – Geoffroy

+0

@Geoffroy: इसके लिए कोई कोर भाषा स्तर का समर्थन नहीं है लेकिन enable_if का उपयोग करके किया जा सकता है (मेरा जवाब देखें)। यह थोड़ा बोझिल हो सकता है लेकिन मैं कुछ सहायक प्रकारों की कल्पना कर सकता हूं जो भिन्नता वाले टेम्पलेट्स का उपयोग करके सी ++ 2011 में इस अच्छे सिंटैक्स को दे सकते हैं (मैंने अभी तक इसका प्रयोग नहीं किया है)। –

+0

क्या आप समर्थित प्रकारों के लिए एक ही परिभाषा लागू करना चाहते हैं, या क्या आपको इसे प्रत्येक के लिए अलग-अलग परिभाषित करने की आवश्यकता है? यानी 'f ' '' के समान शरीर है? –

उत्तर

8

कुछ आकार या रूप में 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 से प्राप्त किया गया है यदि यह आपके द्वारा उपयोग की जा रही मानक लाइब्रेरी के साथ उपलब्ध नहीं है।

सामान्य रूप से, स्पष्ट प्रतिबंधों को लागू करने के लिए अक्सर अनावश्यक होता है क्योंकि टेम्पलेट कार्यान्वयन में आम तौर पर निहित प्रतिबंध होते हैं। हालांकि, कभी-कभी यह कुछ प्रकारों को अक्षम या सक्षम करने में मददगार होता है।

0

आप मूल्यों के प्रकारों की जांच कर सकते हैं। यदि वे आपके नामित प्रकारों में से एक हैं तो आप आगे बढ़ सकते हैं, अगर नहीं तो आप फ़ंक्शन वापस कर सकते हैं। अधिक जानकारी के लिए यहां देखें: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fthe_typeid_operator.htm

टाइपिड के उपयोग के साथ आपको एक संकलन फेंकने में भी सक्षम होना चाहिए।

0

आमतौर पर कुछ प्रकार के श्वेतसूची में टेम्पलेट्स के उपयोग को प्रतिबंधित करता है।

बूस्ट ने concepts कहा है जो मूल रूप से टेम्पलेट्स के लिए इंटरफेस हैं। कुछ प्रकारों को श्वेतसूची के बजाय आप संकलित समय त्रुटियों को बना सकते हैं यदि कुछ स्थितियां (कार्य अनुपलब्ध हैं, या गलत तर्क आदि के साथ) पूरी नहीं हुई हैं। निश्चित रूप से आप इसका उपयोग अपने टेम्पलेट तर्कों को कुछ प्रकारों तक सीमित करने के लिए भी कर सकते हैं।

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

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