特定の double/float 変数に実際のビット パターン 0x0 があることを確認したいと考えています。qIsNull()
理由は聞かないでください。私がしたいQt () の関数で使用されています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 では a として機能しますが、Clang 3.1 では失敗します (当然のことながら、ポインター操作の b/c)。
最終的なアイデアは、Alexandrescuesque に行き、これを行うことでした。
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);
しかし、それは Clang にとっても十分に賢明ではありません。
note: read of member 't2' of union with active member 't1' is not allowed in a constant expression
constexpr operator T2() const { return t2; }
^
他の誰かが良い考えを持っていますか?