1

例子:

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

是否有可能让 std::is_integral<IntWrapper>::value 为真?

谢谢。

4

1 回答 1

3

有可能成std::is_integral<IntWrapper>::value真吗?

对的,这是可能的。但并非没有创建未定义的行为。即,当您尝试这样做时,产生的未定义行为可能正是您想要的。或者它可能是你不想要的任何东西。测试也无济于事。

但一切都没有丢失。您可以轻松地创建自己的 trait 来做您想做的事。例如:

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.

于 2014-08-19T03:11:27.200 回答