基本的なC++ 03列挙型は、したがって、私は値で、それを渡すことを期待する、派手な名前を持つだけで積分値である....私はまた、ほとんどのことを決定するためにT=SomeEnum
とboost::call_traits<T>::param_type
を期待する。このためなぜboost :: call_traits <T> :: param_typeが列挙型の参照ですか?
パスの効率的な方法T
は価値があります。ブーストのドキュメントから
Call Traitsを参照してください。
は、関数に型Tのパラメータを渡すために「最善」の方法を表しタイプを定義します。
boost::call_traits<T>::param_type
をT=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;
}
[コード] enumsに対してfalseである['is_integral'](http://www.boost.org/doc/libs/1_51_0/boost/type_traits/is_integral.hpp)に依存するという結論に達しました。これは、すべての整数型が真であることに特化されており、他のすべてに対しては偽です。これまで考えたことはありませんでしたが、関数の引数でも、 'enum'はテンプレートで' int'にはなりません。 – BoBTFish
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
@BoBTFishテンプレート内の 'enum' /' int'は、私を立ち上げてこの質問を促したものです...とにかく 'enum'を渡すべきかどうかを判断する' boost :: call_traits' boost :: call_traitsは 'boost :: is_enum'と' is_integral'を使うことができます。 – mark