Я хотел написать несколько шаблонных функций для обработки каламбура определенным образом, поэтому я придумал эти две функции. Первый берет объект и с помощью каламбура преобразует его в другой. Это гарантирует, что оба типа являются 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
в качестве возвращаемого типа первого из них может оказаться полезным (не то, чтобы я пробовал любой из этого, заметьте). - person WhozCraig   schedule 19.05.2014