2013-01-12 11 views
20

मैं एक वर्ग टेम्पलेट कैसे लिखूं जो केवल संख्यात्मक प्रकारों को स्वीकार करता है (int, double, float, आदि) टेम्पलेट के रूप में?संख्यात्मक प्रकारों के लिए कक्षा टेम्पलेट

+0

@KonradRudolph Do आप शीर्षक को भी ठीक करना चाहते हैं? मैं उलझन में हूं अगर ओपी वास्तव में प्रकार का मतलब है या वास्तव में उन प्रकार के स्थिरांक का मतलब है। – pmr

+0

@pmr मैंने नहीं किया (लेकिन अब मैंने किया), अच्छी पकड़। मुझे पूरा यकीन है कि ओपी का मतलब है, यदि किसी अन्य कारण के लिए कि आप गैर-अभिन्न प्रकारों का उपयोग गैर-प्रकार के टेम्पलेट्स के रूप में नहीं कर सकते हैं, और यह कि गैर-प्रकार के टेम्पलेट्स के बारे में बात करते समय प्रश्न शुरू करने का कोई अर्थ नहीं है। –

+0

@ कोनराड रुडॉल्फ हाँ, मेरा मतलब है प्रकार। – djWann

उत्तर

26

आप std::is_arithmetic टाइप विशेषता का उपयोग कर सकते हैं। आप केवल इस तरह के एक प्रकार के साथ एक वर्ग के इन्स्टेन्शियशन सक्षम करना चाहते हैं, std::enable_if साथ संयोजन के रूप में इसका इस्तेमाल करते हैं: उपयोग करने के लिए आसान है कि enable_if का एक संस्करण है, और disable_if के एक मुक्त इसके लिए

#include <type_traits> 

template< 
    typename T, //real type 
    typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type 
> struct S{}; 

int main() { 
    S<int> s; //compiles 
    S<char*> s; //doesn't compile 
} 

, मैं अत्यधिक पढ़ने की सलाह देते हैं इस मामले पर this wonderful article (या cached version)।

+2

आप 'टाइपनाम डमी =' को छोड़ सकते हैं। इसके अलावा मैं अत्यधिक [व्हील] (https://bitbucket.org/martinhofernandes/wheels) का उपयोग करने की सलाह देता हूं, यह कोड को काफी सरल बनाता है: 'टेम्पलेट <टाइपनाम टी, पहियों: सक्षम करें अगर >> ' –

+0

@ KonradRudolph, तुम सही हो, धन्यवाद। और मैं आगे पढ़ने के लिए अपने 'enable_if' पोस्ट में एक लिंक जोड़ूंगा। – chris

+0

@ कोनराड रुडॉल्फ, 'डमी' को हटाने से यह संकलित नहीं हुआ है, लेकिन मुझे इसके साथ बहुत अनुभवी नहीं है, इसलिए मैं यह नहीं कह सकता कि इसके अलावा, यह कैसे होना चाहिए। मुझे एहसास हुआ कि मैं व्यर्थ नाम को हटा सकता हूं, हालांकि। – chris

3

मैं template<typename T, typename = ...> दृष्टिकोण अत्यधिक गुप्त (वी.एस. 2015) से प्राप्त त्रुटि संदेश मिल गया, लेकिन पाया गया कि एक ही प्रकार विशेषता के साथ एक static_assert भी काम करता है और मुझे एक त्रुटि संदेश निर्दिष्ट कर सकते हैं:

#include <type_traits> 

template <typename NumericType> 
struct S 
{ 
    static_assert(std::is_arithmetic<NumericType>::value, "NumericType must be numeric"); 
}; 

template <typename NumericType> 
NumericType add_one(NumericType n) 
{ 
    static_assert(std::is_arithmetic<NumericType>::value, "NumericType must be numeric"); 
    return n + 1; 
} 

int main() 
{ 
    S<int> i; 
    S<char*> s; //doesn't compile 

    add_one(1.f); 
    add_one("hi there"); //doesn't compile 
} 
+0

निश्चित रूप से। यह संदेश यहां जोड़ना अच्छा लगेगा। – kyb

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