例子:
struct IntWrapper { int x; operator int() const { return x; } ... }
static_assert(std::is_integral<IntWrapper>::value, "Invalid type.");
是否有可能让 std::is_integral<IntWrapper>::value 为真?
谢谢。
例子:
struct IntWrapper { int x; operator int() const { return x; } ... }
static_assert(std::is_integral<IntWrapper>::value, "Invalid type.");
是否有可能让 std::is_integral<IntWrapper>::value 为真?
谢谢。
有可能成
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
.