2010-08-11 15 views
6

कुछ एसटीडी टेम्पलेट समारोह के विवरण में मैं की तरह कुछ देखा:उस टेम्पलेट के पैरामीटर प्रकार को कैसे जांचें अभिन्न है?

यदि टेम्पलेट पैरामीटर अभिन्न प्रकार का है, व्यवहार में इस तरह के और इस तरह के है।
अन्यथा, यह इस तरह और इस तरह है।

मैं एक ऐसी ही परीक्षण कर सकते हैं कैसे? शायद गतिशील_कास्ट?

के बाद से समारोह मैं लिखने के केवल सही पैरामीटर की आपूर्ति करने के लिए मैं अपने आप को पर भरोसा कर सकते मेरी निजी इस्तेमाल के लिए है, लेकिन क्यों कुछ सीखने का मौका याद आती है? :)

उत्तर

4

अन्य उत्तर के अलावा, यह ध्यान दिया जाना चाहिए मौसम प्रकार अभिन्न अंग है या नहीं है कि परीक्षण रनटाइम पर, लेकिन यह भी संकलन समय पर इस्तेमाल किया जा सकता के आधार पर सही कार्यान्वयन चयन करने के लिए:

रनटाइम संस्करण :

// Include either <boost/type_traits/is_integral.hpp> (if using Boost) 
// or <type_traits> (if using c++1x) 
// In the following, is_integral shoudl be prefixed by either boost:: or std:: 

template <typename T> 
void algorithm(const T & t) 
{ 
    // some code 

    if (is_integral<T>::value) 
    { 
     // operations to perform if T is an integral type 
    } 
    else 
    { 
     // operations to perform if T is not an integral type 
    } 

    // some other code 
} 

हालांकि, इस समाधान सुधार किया जा सकता है जब एल्गोरिथ्म के कार्यान्वयन बहुत परीक्षण पर निर्भर करता है। इस मामले में, हम समारोह के शीर्ष पर परीक्षण, तो एक बड़ा then ब्लॉक और एक बड़ा else ब्लॉक होगा। इस मामले में एक आम दृष्टिकोण फ़ंक्शन को अधिभारित करना है और संकलक को SFINAE का उपयोग करके सही कार्यान्वयन का चयन करना है। एक आसान तरीका है यह करने के लिए boost::enable_if उपयोग करने के लिए है:

#include <boost/utility/enable_if.hpp> 
#include <boost/type_traits/is_integral.hpp> 

template <typename T> 
typename boost::enable_if<boost::is_integral<T> >::type 
algorithm(const T & t) 
{ 
    // implementation for integral types 
} 

template <typename T> 
typename boost::disable_if<boost::is_integral<T> >::type 
algorithm(const T & t) 
{ 
    // implementation for non integral types 
} 

जब algorithm समारोह लागू, संकलक "का चयन करें" सही टेम्पलेट पैरामीटर मौसम पर निर्भर करता है कार्यान्वयन अभिन्न अंग है या नहीं।

+0

बहुत उपयोगी, धन्यवाद – davka

+0

मैं कहूंगा कि इसके अनाज के हर कंपाइलर आपके पहले उदाहरण में मृत शाखा को खत्म कर देगा - यह काफी आसान है। –

+1

@ जॉर्ज ट्रिट्स्शे: यह सच है, इसलिए मैंने संभावित प्रदर्शन लाभ के बारे में कुछ भी नहीं कहा। फिर भी, मुझे लगता है कि ओवरलोडिंग दृष्टिकोण स्पष्ट है: दो कार्यान्वयन अलग-अलग विकसित हो सकते हैं, और मुझे स्थिर (संकलित समय पर ज्ञात/प्रदर्शन) और गतिशील (रनटाइम पर ज्ञात/प्रदर्शन) के बीच भेदभाव करना बेहतर लगता है। लेकिन ठीक है, ऐसा इसलिए हो सकता है क्योंकि मैंने पिछले महीनों में मेटाप्रोग्रामिंग करने में बहुत अधिक समय बिताया था! –

3

One possibility:

#include <type_traits> 
#include <iostream> 

struct trivial 
{ 
    int val; 
}; 

int main() 
{ 
    std::cout << "is_integral<trivial> == " << std::boolalpha 
     << std::is_integral<trivial>::value << std::endl; 
    std::cout << "is_integral<int> == " << std::boolalpha 
     << std::is_integral<int>::value << std::endl; 
    std::cout << "is_integral<float> == " << std::boolalpha 
     << std::is_integral<float>::value << std::endl; 

    return (0); 
} 

तो तुम तो std::is_integral<> का उपयोग कार्रवाई निर्धारित करने के लिए।

1

Boost.TypeTraits is_integral <>() प्रदान करता है, जैसा कि एक अन्य प्रतिक्रिया में वर्णित है, यदि आपका कंपाइलर अभी तक अगले मानक की सी ++ सुविधाओं का समर्थन नहीं करता है।

+0

शायद नहीं, मैं सिर्फ देख लिया है है कि मैं type_traits फ़ाइल को शामिल नहीं है। 'Linux' और 'जीसीसी' टैग ... – davka

+0

@davka जोड़ लिया है करना चाहिए: उन्हें टैग बढ़ावा कोई लेना देना नहीं है। यदि हेडर गुम है, तो आपको या तो हेडर के लिए खोज पथ में सही स्थान जोड़ने या बूस्ट इंस्टॉल करने की आवश्यकता है। –

1

यदि आप सी ++ 11 सुविधाओं का उपयोग करने में असमर्थ हैं, std::numeric_limits<T>::is_integerthe same thingstd::is_integral<T>::value के रूप में है, और सी ++ 98 के साथ उपलब्ध है। 98 संस्करण बौद्धिक अत्याधुनिक जर है

ध्यान दें कि, Gral inte नहीं।

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

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