2012-11-16 3 views
8

Ein Grund 03 ++ C Aufzählungstyp ist nur ein fester Wert mit einem ausgefallenen Namen, deshalb würde ich erwarten, dass es nach Wert zu übergeben ....Warum ist boost :: call_traits <T> :: param_type eine Referenz für aufgezählte Typen?

Aus diesem Grunde, dass die meisten zu bestimmen, würde ich auch boost::call_traits<T>::param_type mit T=SomeEnum erwarten effizienter Weg T ist nach Wert.

Von Boost-Dokumentation Call Traits:

einen Typ definiert, dass die „beste“ Art und Weise repräsentiert einen Parameter des Typs T an eine Funktion zu übergeben.

Wenn ich boost::call_traits<T>::param_type mit T=SomeEnum verwenden bestimmt sie, dass SomeEnum sollte als Referenz übergeben werden.

Ich würde auch erwarten, C++11 class enums auch nach Wert übergeben werden.

Testcode:

#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

Ich hatte ein wenig Blick durch das [code] (http://www.boost.org/doc/libs/1_51_0/boost/detail/call_traits.hpp), und kam zu dem Schluss, dass es auf ['is_integral'] (http://www.boost.org/doc/libs/1_51_0/boost/type_traits/is_integral.hpp) ankommt, was für enums falsch ist. Es ist darauf spezialisiert, dass alle integralen Typen wahr und falsch für alles andere sind. Ich habe vorher nie wirklich darüber nachgedacht, aber ich schätze, 'Enum's können' nicht' in Templates sein, obwohl sie in Funktionsargumenten stehen können. – BoBTFish

+1

Heh, das könnte anscheinend mit boost ['is_enum'] (http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_enum.html) geschehen, wenn sie wollte: http://stackoverflow.com/questions/1619993/template-specialization-for-enum Also war es vielleicht eine bewusste Wahl? Oder einfach übersehen? – BoBTFish

+0

@BoBTFish die 'enum' /' int' in Templates ist etwas, das mich überfallen hat, diese Frage veranlassend .... trotzdem würde ich immer noch 'boost :: call_traits' erwarten, um zu bestimmen, dass eine' enum' weitergegeben werden sollte Wert, 'boost :: call_traits' könnte immer 'boost :: is_enum' sowie' is_integral' verwenden. – mark

Antwort

Verwandte Themen