该memcpy()
方法应该是您首选的类型双关语方法:
double d = 100;
void *x;
std::memcpy(&x, &d, sizeof x);
std::cout << x << '\n';
double d2;
std::memcpy(&d2, &x, sizeof d2);
std::cout << d2 << '\n';
您可能认为这会比强制转换慢,但实际上编译器足够聪明,可以识别这里发生的事情并生成最佳代码:http ://blog.regehr.org/archives/959
此外,此方法不会因使用强制转换或联合方法时发生的别名违规而导致未定义的行为。
您可以编写一个bit_cast
运算符来使这更方便和更安全:
http://pastebin.com/n4yDjBde
template <class Dest, class Source>
inline Dest bit_cast(Source const &source) {
static_assert(sizeof(Dest)==sizeof(Source), "size of destination and source objects must be equal");
static_assert(std::is_trivially_copyable<Dest>::value, "destination type must be trivially copyable.");
static_assert(std::is_trivially_copyable<Source>::value, "source type must be trivially copyable");
Dest dest;
std::memcpy(&dest, &source, sizeof(dest));
return dest;
}
示例用法:
void *p = ...;
double d = bit_cast<double>(p);
如果你做类型双关语,你应该知道所涉及类型的陷阱值以及你的编译器对陷阱和未指定值的行为。