2012-11-16 10 views
8

Una base C++ 03 tipo enumerato è solo un valore integrale con un nome di fantasia, quindi mi aspetto di passare per valore ....Perché boost: call_traits <T> :: param_type un riferimento per i tipi enumerati?

Per questo motivo mi aspetterei anche boost::call_traits<T>::param_type con T=SomeEnum per determinare che il più modo efficiente di passare T è in base al valore.

Dalla documentazione spinta vedere Call Traits:

definisce un tipo che rappresenta il modo "migliore" per passare un parametro di tipo T a una funzione.

Quando uso boost::call_traits<T>::param_type con T=SomeEnum essa determina che SomeEnum dovrebbe essere passato per riferimento.

Mi aspetto inoltre che anche C++11 class enums venga passato per valore.

Codice di prova:

#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

Ho dato un'occhiata al [codice] (http://www.boost.org/doc/libs/1_51_0/boost/detail/call_traits.hpp), ed è giunto alla conclusione che dipende da ['is_integral'] (http://www.boost.org/doc/libs/1_51_0/boost/type_traits/is_integral.hpp), che è falso per enumerazioni. È specializzato per tutti i tipi interi per essere vero, e falso per tutto il resto. Non ci avevo mai pensato prima, ma suppongo che 'enum's non possa essere' int's nei template, anche se possono funzionare in argomenti di funzione. – BoBTFish

+1

Heh, a quanto pare questo potrebbe essere fatto con boost ['is_enum'] (http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_enum.html) se essi desiderato: http://stackoverflow.com/questions/1619993/template-specialization-for-enum Quindi forse è stata una scelta deliberata? O semplicemente trascurato? – BoBTFish

+0

@BoBTFish il 'enum' /' int' nei template è qualcosa che mi ha fatto inciampare, suggerendo questa domanda .... comunque mi aspetterei comunque 'boost :: call_traits' per determinare che un' enum' dovrebbe essere passato da valore, 'boost :: call_traits' potrebbe sempre usare' boost :: is_enum' così come 'is_integral'. – mark

risposta

Problemi correlati