【发布时间】:2014-05-19 19:20:33
【问题描述】:
我想编写一些模板函数来以定义的方式处理类型双关语,所以我想出了这两个函数。第一个获取一个对象并通过双关语将其转换为另一个对象。它确保两种类型都是 POD 并且大小相同。第二个旨在简单地获取任何指针(就像 void*),但仍然检查以确保指针指向 POD 类型。我遇到的问题是,如果我传递一个非常量指针,那么将使用第一个函数。处理此问题的最佳方法是什么?
template <class TO, class FROM>
FORCE_INLINE TO punning_cast(const FROM &input)
{
static_assert(std::is_pod<TO>::value, "TO must be POD");
static_assert(std::is_pod<FROM>::value, "FROM must be POD");
static_assert(sizeof(TO) == sizeof(FROM), "TO and FROM must be the same size");
TO out;
std::memcpy(&out, &input, sizeof(TO));
return out;
}
template <class TO, class FROM>
FORCE_INLINE TO punning_cast(const FROM *input)
{
static_assert(std::is_pod<TO>::value, "TO must be POD");
static_assert(std::is_pod<FROM>::value, "FROM must be POD");
TO out;
std::memcpy(&out, input, sizeof(TO));
return out;
}
【问题讨论】:
-
也许
typename std::enable_if<!std::is_pointer<FROM>::value,TO>::type作为前者的返回类型可能会有所帮助(我不会尝试任何,请注意)。 -
@WhozCraig 我已经回答过了
-
(只是指出这一点,以免看起来我偷了你的评论来回答)
标签: c++ templates c++11 type-conversion type-punning