示例:
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?
感谢。
答案 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
。