C 11 유형 특성을 사용하여 멤버 함수 존재 감지
질문:
어떻게 할 수 있나요? 클래스가 제공할 것을 요구하지 않고 클래스가 특정 시그니처를 가진 멤버 함수를 가지고 있는지 확인합니다. ?
딜레마의 정교화:
클래스에 특정 멤버 함수가 있는지 여부에 따라 사용자 지정 작업을 수행해야 할 때 문제가 발생합니다. 클래스가 기능을 제공해야 하는 경우와 달리 조건부 처리를 위해 그 존재를 식별하는 방법을 모색합니다. 이상적인 솔루션은 전역 함수 덮어쓰기, 과도한 스택 호출 및 침입적인 네임스페이스 선언을 방지합니다.
템플릿 기반 솔루션:
C 11 유형 특성을 활용하여 다음을 고안할 수 있습니다. 타겟의 존재를 확인하는 템플릿 함수 함수:
template<typename C, typename Ret, typename... Args> struct has_serialize { // Assertion to prevent instantiation with non-function arguments static_assert( std::integral_constant<T, false>::value, "Second template parameter needs to be of function type." ); // Specialization to perform the check private: template<typename T> static constexpr auto check(T*) -> typename std::is_same< decltype( std::declval<T>().serialize( std::declval<Args>()... ) ), Ret // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >::type; // attempt to call it and see if the return type is correct template<typename> static constexpr std::false_type check(...); typedef decltype(check<C>(0)) type; public: static constexpr bool value = type::value; };
사용:
이제 has_serialize 템플릿을 사용하여 클래스 내 함수 존재를 확인할 수 있습니다.
struct X { int serialize(const std::string&) { return 42; } }; struct Y : X {}; std::cout << has_serialize<X, int(const std::string&)>::value; // prints 1
In 위의 예에서는 has_serialize
위 내용은 C 11 유형 특성은 특정 서명이 있는 멤버 함수의 존재를 어떻게 감지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!