2012-11-16 8 views
8

Podstawowym C++ 03 Typ wyliczeniowy jest po prostu integralną wartość z osobliwej nazwie, więc byłoby oczekiwać, aby przekazać go przez wartość ....Dlaczego parametr boost :: call_traits <T> :: param_type jest referencją dla typów wyliczeniowych?

Z tego powodu chciałbym również spodziewać boost::call_traits<T>::param_type z T=SomeEnum w celu określenia, które najbardziej skuteczny sposób przejścia T jest według wartości.

Z dokumentacji doładowania zobaczyć Call Traits:

Definiuje typ, który reprezentuje „najlepszy” sposób przekazać parametr typu T do funkcji.

Gdy używam boost::call_traits<T>::param_type z T=SomeEnum stwierdzi, że SomeEnum powinny być przekazywane przez referencję.

Spodziewam się również, że C++11 class enums również zostanie przekazane według wartości.

Code Test:

#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

Przeanalizowałem [kod] (http://www.boost.org/doc/libs/1_51_0/boost/detail/call_traits.hpp), i doszli do wniosku, że to zależy od ['is_integral'] (http://www.boost.org/doc/libs/1_51_0/boost/type_traits/is_integral.hpp), który jest fałszywy dla wyliczenia. Specjalizuje się, aby wszystkie integralne typy były prawdziwe, a fałsz dla wszystkiego innego. Nigdy tak naprawdę nie myślałem o tym wcześniej, ale myślę, że 'wyliczenie 'nie może być' int's w szablonach, nawet jeśli mogą one w argumentach funkcji. – BoBTFish

+1

Heh, najwyraźniej można to zrobić za pomocą boost ['is_enum'] (http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_enum.html), jeśli chciał: http://stackoverflow.com/questions/1619993/template-specialization-for-enum Więc może to był celowy wybór? Lub po prostu przeoczony? – BoBTFish

+0

@BoBTFish 'enum' /' int' w szablonach jest czymś, co mnie potknęło, podpowiadając to pytanie .... w każdym razie wciąż oczekiwałbym 'boost :: call_traits' by ustalić, że' enum' powinno zostać przekazane przez wartość, 'boost :: call_traits' może zawsze używać' boost :: is_enum' oraz 'is_integral'. – mark

Odpowiedz

Powiązane problemy