【问题标题】:Why is boost::call_traits<T>::param_type a reference for enumerated types?为什么 boost::call_traits<T>::param_type 是枚举类型的引用?
【发布时间】:2012-11-05 02:02:39
【问题描述】:

基本的 C++ 03 枚举类型只是一个具有花哨名称的整数值,因此我希望按值传递它......

出于这个原因,我还期望boost::call_traits&lt;T&gt;::param_typeT=SomeEnum 确定传递T 的最有效方式是按值。

从 boost 文档中看到 Call Traits:

定义一个类型,表示将 T 类型的参数传递给函数的“最佳”方式。

当我使用 boost::call_traits&lt;T&gt;::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;
}

【问题讨论】:

  • 我看了一眼code,得出的结论是它依赖于is_integral,这对于枚举是错误的。它专门用于所有整数类型为真,而其他所有类型为假。我以前从未真正考虑过,但我猜enums 在模板中不能是ints,即使它们可以在函数参数中。
  • 嘿,如果他们愿意的话,显然这可以通过 boost is_enum 来完成:stackoverflow.com/questions/1619993/… 所以也许这是一个深思熟虑的选择?还是被忽视了?
  • @BoBTFish 模板中的enum/int 让我感到困惑,提示了这个问题....无论如何我仍然希望boost::call_traits 确定enum应该按值传递,boost::call_traits 总是可以使用boost::is_enum 以及is_integral
  • @BoBTFish 我想它必须在最新版本(1.52)中修复,我会在星期一检查。您能否将票证的链接放在答案中,以便我接受。

标签: c++ templates boost


【解决方案1】:

这已更新为在实现中包含对is_enum 的检查。请参阅此错误报告,2 个月前关闭:https://svn.boost.org/trac/boost/ticket/5790

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多