Я хочу проверить, что данная переменная типа double / float имеет фактический битовый шаблон 0x0. Не спрашивайте, почему он используется в функции Qt ( qIsNull ()
), которую я хотел бы использовать в качестве constexpr
.
В исходном коде использовалось объединение:
union { double d; int64_t i; } u;
u.d = d;
return u.i == 0;
Конечно, это не работает как constexpr
.
Следующая попытка была с reinterpret_cast
:
return *reinterpret_cast<int64_t*>(&d) == 0;
Но хотя это работает как constexpr
в GCC 4.7, оно терпит неудачу (по праву, b / c манипуляции с указателями) в Clang 3.1.
Конечной идеей было пойти в Александрескуэск и сделать следующее:
template <typename T1, typename T2>
union Converter {
T1 t1;
T2 t2;
explicit constexpr Converter( T1 t1 ) : t1(t1) {}
constexpr operator T2() const { return t2; }
};
// in qIsNull():
return Converter<double,int64_t>(d);
Но и для Кланга этого не хватило:
note: read of member 't2' of union with active member 't1' is not allowed in a constant expression
constexpr operator T2() const { return t2; }
^
Есть ли у кого-нибудь еще хорошая идея?