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;
}
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
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
@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