2012-11-16 5 views
8

एक बुनियादी सी ++ 03 enumerated प्रकार, एक फैंसी नाम के साथ सिर्फ एक अभिन्न मूल्य है इसलिए मैं मान द्वारा इसे पारित करने के उम्मीद करेंगे ....बूस्ट क्यों है :: call_traits <T> :: param_type गणित प्रकारों के लिए संदर्भ?

इस कारण से मैं भी निर्धारित करने के लिए है कि सबसे T=SomeEnum साथ boost::call_traits<T>::param_type उम्मीद करेंगे के लिए पास T का प्रभावी तरीका मूल्य से है।

बढ़ावा प्रलेखन से Call Traits देखें:

एक प्रकार है कि "सर्वश्रेष्ठ" जिस तरह से एक समारोह के प्रकार टी के एक पैरामीटर पारित करने के लिए का प्रतिनिधित्व करता है परिभाषित करता है।

जब मैं T=SomeEnum साथ boost::call_traits<T>::param_type का उपयोग यह निर्धारित करता है कि SomeEnum संदर्भ द्वारा पारित किया जाना चाहिए।

मैं भी उम्मीद करेंगे C++11 class enums भी मूल्य द्वारा पारित किया जाना है।

टेस्ट कोड:

#include <string> 
#include <typeinfo> 
#include <boost/call_traits.hpp> 
#include <boost/type_traits/is_reference.hpp> 

enum SomeEnum 
{ 
    EN1_ZERO = 0, 
    EN1_ONE, 
    EN1_TWO, 
    EN1_THREE 
}; 

struct SomeStruct 
{}; 

template<typename T> 
void DisplayCallTraits(const std::string& desc) 
{ 
    typedef typename boost::call_traits<T>::param_type param_type; 
    std::cout << "-----------------------------------------------------\n"; 
    std::cout << "Call traits for: " << desc << "\n"; 
    std::cout << "\ttypeof T : " << typeid(T).name() << "\n"; 
    std::cout << "\ttypeof param_type : " << typeid(param_type).name() << "\n"; 
    std::cout << "\tis_reference<param_type> : " << std::boolalpha 
       << boost::is_reference<param_type>::value << "\n"; 
} 

int main(int, char**) 
{ 
    DisplayCallTraits<unsigned>("unsigned");  // pass by value, as expected 
    DisplayCallTraits<SomeStruct>("struct");  // pass by reference, as expected 
    DisplayCallTraits<SomeEnum>("enumeration"); // pass by reference - why? 

    return 0; 
} 
+1

मुझे [कोड] (http://www.boost.org/doc/libs/1_51_0/boost/detail/call_traits.hpp) के माध्यम से थोड़ा सा देखा गया था, और निष्कर्ष है कि यह [ 'is_integral'] (http://www.boost.org/doc/libs/1_51_0/boost/type_traits/is_integral.hpp) है, जो enums के लिए गलत है पर निर्भर करता है के लिए आया था। यह सभी अभिन्न प्रकारों के लिए सत्य है, और बाकी सब कुछ के लिए झूठा है। मैंने पहले कभी इसके बारे में सोचा नहीं था, लेकिन मुझे लगता है कि 'enum' टेम्पलेट्स में int नहीं हो सकता है, भले ही वे कार्य तर्कों में हो। – BoBTFish

+1

हे, जाहिरा तौर पर इस बढ़ावा के साथ किया जा सकता है [ 'is_enum'] (http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_enum.html) अगर वे चाहता था: http://stackoverflow.com/questions/1619993/template-specialization-for-enum तो शायद यह एक जानबूझकर विकल्प था? या बस अनदेखा किया? – BoBTFish

+0

@BoBTFish 'enum' /' टेम्पलेट्स में int' कुछ है कि मुझे फिसल गया था, इस सवाल का उत्साह है .... वैसे भी मैं अभी भी उम्मीद 'बढ़ावा देने :: call_traits' निर्धारित करने के लिए है कि एक' enum' द्वारा पारित किया जाना चाहिए होगा मान, 'boost :: call_traits' हमेशा' boost :: is_enum' के साथ-साथ 'is_integral' का उपयोग कर सकता है। – mark

उत्तर

2

इस कार्यान्वयन में is_enum को एक चेक शामिल करने के लिए अद्यतन किया गया है। इस बग रिपोर्ट को देखें, 2 महीने पहले बंद: https://svn.boost.org/trac/boost/ticket/5790

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