Как проверить, что битовый шаблон типа double равен 0x0 в constexpr C ++ 11?

Я хочу проверить, что данная переменная типа 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; }
                                       ^

Есть ли у кого-нибудь еще хорошая идея?

9
задан Marc Mutz - mmutz 17 February 2012 в 12:31
поделиться