내가
을 다음과 같이 SFINAE를 사용하여, 당신이 뭔가를 쓸 수 있다고 가정 :
이
template <typename T, typename Iter>
inline T combine_bytes(std::vector<unsigned char>::Iter const &start,
std::vector<unsigned char>::Iter const &end,
bool bigendian)
{
T ret;
std::copy(start, end, reinterpret_cast<unsigned char *>(&ret));
return ret;
}
내가 얻는 컴파일 오류는 다음과 같습니다
예를 들어
, 이것은 내가하고 싶은 것입니다
template <typename T, typename Iter>
inline typename std::enable_if<
std::is_same<Iter, std::vector<unsigned char>::iterator>{}
|| std::is_same<Iter, std::vector<unsigned char>::reverse_iterator>{},
T >::type combine_bytes (Iter const & start,
Iter const & end,
bool bigendian)
{
T ret;
std::copy(start, end, reinterpret_cast<unsigned char *>(&ret));
return ret;
}
다음과 같습니다. 일반 템플릿 유형 Iter
에 대한 함수를 정의하고 Iter
는 std::vector<unsigned char>::iterator
또는 std::vector<unsigned char>::reverse_iterator
이 방법은 SFINAE를 사용합니까? 나는 추측하고있다. – ctzdev
이것을 컴파일하려면'static_assert'에서'unsigned char &'로 체크 할 타입을 변경해야합니다. 그래서 이것은 다음과 같이 보입니다 :'static_assert (std :: is_same ::, "unsigned char을 사용해야합니다)", –
ctzdev
@ctzdev 'decltype (* start)'대신'std :: decay_t'을 사용할 수 있습니다. 그것은 기술적으로'unsigned char &'를 사용하는 것보다 정확합니다. 왜냐하면 읽기 전용 이터레이터를 받아 들일 것이기 때문입니다. 그러나 그 차이는 사소한 것입니다. –