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 중국어 웹사이트의 기타 관련 기사를 참조하세요!