我想检查给定的双精度/浮点变量是否具有实际的位模式 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;
但是,虽然它在 GCC 4.7 中作为 a 起作用constexpr
,但在 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; }
^
还有其他人有什么好主意吗?