>백엔드 개발 >C++ >C 11 유형 특성은 특정 서명이 있는 멤버 함수의 존재를 어떻게 감지할 수 있습니까?

C 11 유형 특성은 특정 서명이 있는 멤버 함수의 존재를 어떻게 감지할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-26 22:59:10945검색

How Can C  11 Type Traits Detect the Presence of a Member Function with a Specific Signature?

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&amp;) { return 42; } 
};

struct Y : X {};

std::cout << has_serialize<X, int(const std::string&amp;)>::value; // prints 1

In 위의 예에서는 has_serialize::value도 상속이 함수 서명을 유지하므로 true로 평가됩니다. 이 기능은 원래 스레드에 제시된 솔루션에 비해 중요한 이점입니다.

위 내용은 C 11 유형 특성은 특정 서명이 있는 멤버 함수의 존재를 어떻게 감지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.