Черты типа C ++ 11: арифметический тип пользователя

Пример:

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

Можно ли получить std :: is_integral<IntWrapper>:: значение, чтобы быть правдой?

Благодарю.

1

Решение

Можно ли получить 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,

2

Другие решения


По вопросам рекламы [email protected]