2012-11-16 11 views
8

基本的なC++ 03列挙型は、したがって、私は値で、それを渡すことを期待する、派手な名前を持つだけで積分値である....私はまた、ほとんどのことを決定するためにT=SomeEnumboost::call_traits<T>::param_typeを期待する。このためなぜboost :: call_traits <T> :: param_typeが列挙型の参照ですか?

パスの効率的な方法Tは価値があります。ブーストのドキュメントから

Call Traitsを参照してください。

は、関数に型Tのパラメータを渡すために「最善」の方法を表しタイプを定義します。

boost::call_traits<T>::param_typeT=SomeEnumと使用すると、SomeEnumを参照渡しする必要があると判断します。

また、C++11 class enumsも値渡しされると思います。

テストコード:

#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

[コード] enumsに対してfalseである['is_integral'](http://www.boost.org/doc/libs/1_51_0/boost/type_traits/is_integral.hpp)に依存するという結論に達しました。これは、すべての整数型が真であることに特化されており、他のすべてに対しては偽です。これまで考えたことはありませんでしたが、関数の引数でも、 'enum'はテンプレートで' int'にはなりません。 – BoBTFish

+1

Heh、明らかにこれはboost ['is_enum'](http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_enum.html)で実行できます必要があります:http://stackoverflow.com/questions/1619993/template-specialization-for-enum 多分それは意図的な選択でしたか?または単に見落とされた? – BoBTFish

+0

@BoBTFishテンプレート内の 'enum' /' int'は、私を立ち上げてこの質問を促したものです...とにかく 'enum'を渡すべきかどうかを判断する' boost :: call_traits' boost :: call_traitsは 'boost :: is_enum'と' is_integral'を使うことができます。 – mark

答えて

関連する問題