8

基本的なC++03列挙型は、派手な名前の整数値であるため、値で渡すことを期待しています。

このため、パスの最も効率的な方法は値によるものであると判断することも期待boost::call_traits<T>::param_typeします。T=SomeEnumT

Boostのドキュメントから、CallTraitsを参照してください。

タイプ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;
}
4

1 に答える 1

3

is_enumこれは、実装にチェックを含めるように更新されました。2か月前にクローズされたこのバグレポートを参照してください:https ://svn.boost.org/trac/boost/ticket/5790

于 2012-11-16T14:31:59.167 に答える