메타프로그래밍: 오버로드 해결에 따른 전문화
메타프로그래밍에서는 유형 속성을 기반으로 템플릿을 정의하는 것이 일반적입니다. 그러나 주어진 유형에 대해 특정 오버로드가 정의되었는지 여부에 따라 두 템플릿 정의 중에서 선택하려고 할 때 문제가 발생합니다.
Walter Brown은 템플릿 인수가 제공되지 않으면 void를 반환하는 유용한 유형인 void_t를 소개합니다. . 이 개념을 바탕으로 특정 유형에 대한 std::to_string 오버로드가 있는지 확인하는 유형 특성을 정의할 수 있습니다.
template<typename T, typename = void> struct has_to_string : std::false_type { }; template<typename T> struct has_to_string<T, void_t<decltype(std::to_string(std::declval<T>()))>> : std::true_type { };
이 유형 특성을 사용하면 이제 다음과 같은 템플릿을 쉽게 작성할 수 있습니다. std::to_string:
template<typename T> enable_if_t<has_to_string<T>::value, string> stringify(T t){ return std::to_string(t); } template<typename T> enable_if_t<!has_to_string<T>::value, string> stringify(T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }에 대한 오버로드 해결을 기반으로 전문화합니다.
위 내용은 과부하 해결을 기반으로 템플릿을 어떻게 전문화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!