정의 된 방식으로 유형 펀칭을 처리하는 템플릿 함수를 작성하려고 했으므로이 두 함수를 생각해 냈습니다. 첫 번째는 객체를 가져 와서 다른 객체로 전달합니다. 두 유형 모두 POD 및 동일한 크기를 보장합니다. 두 번째는 단순히 포인터를 가져오고 (void *처럼) 포인터가 POD 유형인지 확인합니다. 문제는 비 const 포인터를 전달하면 첫 번째 함수가 대신 사용된다는 것입니다. 이것을 처리하는 가장 좋은 방법은 무엇입니까?함수 템플릿 오버로드 해결
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;
}
아마도'유형 이름 표준 : enable_if <표준 : : :!
는한이 (공통) 문제에 대한 해결책은 구조체의 기능을 포장하고 그 중 하나를 선택하는 도우미 함수를 추가하는 것입니다 :: value, TO> :: type'이 이전의 리턴 타입으로 도움이 될 수 있습니다. – WhozCraig
@WhozCraig 나는 이미 대답했다. –
(단지 이것을 지적 해 주므로 대답을 훔쳤다.) –