C ++ 11类型特征:算术用户类型

时间:2014-08-19 02:09:53

标签: c++ c++11 typetraits usertype

示例:

struct IntWrapper { int x; operator int() const { return x; } ... }
static_assert(std::is_integral<IntWrapper>::value, "Invalid type.");

是否可以将std :: is_integral&lt; IntWrapper&gt; :: value设为true?

感谢。

1 个答案:

答案 0 :(得分:2)

  

是否可以让std::is_integral<IntWrapper>::value成为现实?

是的,有可能。但不是没有创建未定义的行为。即当您尝试执行此操作时,生成的未定义行为可能正是您想要的。或者它可能是你不想要的任何东西。测试没有帮助。

但并非一切都没有丢失。您可以轻松创建自己的特征,以完成您想要的任务。例如:

template <class T>
struct IsMyInt
    : std::is_integral<T>
{
};

template <>
struct IsMyInt<IntWrapper>
    : std::true_type
{
};

static_assert(IsMyInt<IntWrapper>::value, "Invalid type.");

IsMyInt的行为与您希望std::is_integral的行为完全一致,但没有未定义的行为。因此,现在您只需使用IsMyInt代替std::is_integral