유형 특성 감지: is_container 또는 is_Vector 제작
C 영역에서 유형 특성은 조건부 프로그래밍 및 컴파일을 위한 강력한 메커니즘을 제공합니다. 시간 반성. 일반적인 사용 사례 중 하나는 서로 다른 컨테이너 유형을 구별하는 유형 특성을 생성하는 것입니다.
질문:
모두에 대해 true로 평가되는 유형 특성을 만드는 것이 가능합니까? 벡터, 세트, 맵과 같은 일반적인 STL 컨테이너는 무엇입니까? 또한 벡터에 대해 구체적으로 적용되는 유형 특성을 어떻게 정의할 수 있습니까?
답변:
SFINAE를 사용하여 STL 컨테이너 감지:
이를 달성하기 위해 SFINAE(Substitution Failure Is Not An Error)를 사용하여 STL 컨테이너의 특징인 특정 멤버 함수 및 유형을 확인할 수 있습니다. 예는 다음과 같습니다.
<code class="cpp">template<typename T, typename _ = void> struct is_container : std::false_type {}; template<typename... Ts> struct is_container_helper {}; template<typename T> struct is_container< T, std::conditional_t< false, is_container_helper< typename T::value_type, typename T::size_type, typename T::iterator, typename T::const_iterator, decltype(std::declval<T>().size()), decltype(std::declval<T>().begin()), decltype(std::declval<T>().end()), decltype(std::declval<T>().cbegin()), decltype(std::declval<T>().cend()) >, void > > : public std::true_type {};</code>
이 유형 특성은 size(), Begin() 및 end()와 같은 STL 컨테이너와 관련된 공통 멤버 함수 및 유형이 있는지 확인합니다.
벡터 감지:
보다 구체적인 유형 특성의 경우 벡터에 고유한 추가 멤버 함수 및 유형이 있는지 확인할 수 있습니다. 예를 들면 다음과 같습니다.
<code class="cpp">template<typename T, typename Enable = void> struct is_vector { static bool const value = false; }; template<typename T> struct is_vector<T, typename std::enable_if<std::is_same<T, std::vector<__>>::value>::type> { static bool const value = true; };</code>
이 유형 특성은 std::is_same을 사용하여 템플릿 매개변수 T가 구체적으로 std::Vector인지 확인합니다.
결론:
SFINAE 및 조건부 템플릿 전문화를 활용하면 다양한 컨테이너 유형을 정확하게 구별하는 유형 특성을 생성하여 조건부 프로그래밍 및 소프트웨어 엔지니어링 작업에 귀중한 컴파일 시간 정보를 제공할 수 있습니다.
위 내용은 유형 특성으로 벡터, 세트, 맵과 같은 STL 컨테이너를 구별할 수 있습니까? 벡터에 대한 유형 특성을 어떻게 만들 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!