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