> 백엔드 개발 > C++ > C 클래스에 특정 서명이 있는 멤버 함수가 있는지 어떻게 확인할 수 있나요?

C 클래스에 특정 서명이 있는 멤버 함수가 있는지 어떻게 확인할 수 있나요?

DDD
풀어 주다: 2024-12-30 08:55:09
원래의
345명이 탐색했습니다.

How Can I Check if a C   Class Has a Member Function with a Specific Signature?

사용자 정의 서명으로 멤버 함수 존재 확인

이 기사에서는 C 클래스가 특정 멤버 함수를 보유하는지 확인하는 문제를 해결합니다. 지정된 서명으로. Scott Meyers의 책에서 논의된 문제와 달리 여기서의 목표는 기능을 보유한 클래스와 없는 클래스를 구별하는 것입니다.

Template Trick

이를 달성하기 위해 다음을 소개합니다. C 11 기능을 활용하는 템플릿 트릭입니다. has_serialize 템플릿 구조는 기본 템플릿 역할을 하며 두 번째 템플릿 매개변수가 함수 유형이어야 한다고 주장합니다.

함수 확인을 위한 특수화

has_serialize 템플릿의 특수화 실제 기능 검증을 처리합니다. 두 가지 템플릿 함수를 사용합니다.

  • check: 더미 객체에서 지정된 메서드를 호출하려고 시도하고 예상 유형과 비교하여 반환 유형을 확인합니다.
  • type: 반환 유형을 결정합니다. 검사 기능이 예상 유형과 일치합니다.

함수 확인

클래스 C에 Ret(Args...) 서명이 있는 특정 함수 f(Args...)가 있는지 테스트하려면:

std::cout << has_serialize<C, Ret(Args...)>::value << endl;
로그인 후 복사

사용 예

다음 예에서는 X와 X라는 두 클래스를 정의합니다. Y, 여기서 Y는 X에서 상속됩니다. 클래스 X에는 int를 반환하는 멤버 함수 serialize(const std::string&)가 있습니다.

has_serialize 템플릿을 사용하면 X와 Y가 모두 직렬화 함수를 가지고 있는지 확인할 수 있습니다. 올바른 서명 포함:

struct X {
     int serialize(const std::string&amp;) { return 42; } 
};

struct Y : X {};

std::cout << has_serialize<X, int(const std::string&amp;)>::value << endl; // 1 (true)
std::cout << has_serialize<Y, int(const std::string&amp;)>::value << endl; // 1 (true)
로그인 후 복사

이것은 has_serialize 템플릿 트릭이 클래스에 특정 멤버 함수가 포함되어 있는지 여부를 효과적으로 감지할 수 있는 방법을 보여줍니다. 서명.

위 내용은 C 클래스에 특정 서명이 있는 멤버 함수가 있는지 어떻게 확인할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿