> 백엔드 개발 > C++ > C의 맵에 비균질 서명이 있는 함수를 어떻게 저장할 수 있습니까?

C의 맵에 비균질 서명이 있는 함수를 어떻게 저장할 수 있습니까?

Linda Hamilton
풀어 주다: 2024-11-18 07:53:02
원래의
260명이 탐색했습니다.

How Can You Store Functions with Non-Homogeneous Signatures in a Map in C  ?

맵에 비동질 서명이 있는 함수 저장

문제 소개

C에서는 서로 다른 서명이 있는 함수를 고유한 서명과 연결해야 할 필요성이 발생합니다. 런타임 인수를 기반으로 하는 동적 호출을 위한 식별자입니다. 그러나 표준 컨테이너는 비동질 함수 유형의 저장을 직접 지원하지 않습니다.

유형 삭제 및 템플릿 연산자 활용

이 제한을 극복하는 한 가지 접근 방식은 기능 캡슐화와 관련된 유형 삭제입니다. 특정 유형 정보를 지우는 컨테이너에 입력합니다. 이를 통해 다양한 시그니처를 사용하여 함수를 균일하게 저장할 수 있습니다. 이 프로세스를 용이하게 하기 위해 사용자 정의 데이터 구조인 AnyCallable이 정의됩니다.

template<typename Ret>
struct AnyCallable
{
    AnyCallable() {}
    template<typename F>
    AnyCallable(F&& fun) : AnyCallable(std::function(std::forward<F>(fun))) {}
    template<typename ... Args>
    AnyCallable(std::function<Ret(Args...)> fun) : m_any(fun) {}
    template<typename ... Args>
    Ret operator()(Args&& ... args) 
    { 
        return std::invoke(std::any_cast<std::function<Ret(Args...)>>(m_any), std::forward<Args>(args)...); 
    }
    std::any m_any;
};
로그인 후 복사

AnyCallable은 이종 함수 유형을 허용하고 일치하는 인수로 캡슐화된 함수를 호출하기 위한 일반 연산자()를 제공합니다.

구현 예

AnyCallable 데이터 구조를 사용하여 이제 다양한 시그니처를 사용하여 함수를 저장하는 맵을 생성할 수 있습니다.

std::map<std::string, AnyCallable<void>> map;
map["foo"] = &foo;
map["bar"] = &bar;
로그인 후 복사

고유한 문자열 식별자를 기반으로 함수를 동적으로 호출하려면, 우리는 AnyCallable에서 제공하는 연산자()를 활용합니다:

map["foo"](1, 2);
map["bar"]("Hello", 1, 2);
로그인 후 복사

이 접근 방식은 유형 안전성과 비동질 서명이 있는 함수의 동적 호출을 보장하여 다양한 입력이 있는 메서드 포인터를 저장하고 실행하기 위한 다목적 솔루션이 됩니다.

위 내용은 C의 맵에 비균질 서명이 있는 함수를 어떻게 저장할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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