이 코드에서는 문자열을 키로 활용하고 다양한 시그니처를 가진 함수를 저장하는 맵을 생성하는 것을 목표로 합니다. 일반적인 방법을 값으로 사용합니다.
우리는 이를 달성하려면 std::any 라이브러리를 사용하세요. 함수 유형을 컨테이너로 유형 지우면 이를 동적으로 호출하는 템플릿 Operator() 함수를 만들 수 있습니다. 그러나 std::bad_any_cast 예외를 방지하려면 호출 사이트에서 정확한 인수 일치를 지정하는 것이 중요합니다.
다음 코드 조각을 고려하세요.
#include <any> #include <functional> #include <map> #include <string> #include <iostream> using namespace std::literals; 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; }; void foo(int x, int y) { std::cout << "foo" << x << y << std::endl; } void bar(std::string x, int y, int z) { std::cout << "bar" << x << y << z << std::endl; } int main() { std::map<std::string, AnyCallable<void>> map; map["foo"] = &foo; //store the methods in the map map["bar"] = &bar; map["foo"](1, 2); //call them with parameters I get at runtime map["bar"]("Hello, std::string literal"s, 1, 2); try { map["bar"]("Hello, const char *literal", 1, 2); // bad_any_cast } catch (std::bad_any_cast&) { std::cout << "mismatched argument types" << std::endl; } map["bar"].operator()<std::string, int, int>("Hello, const char *literal", 1, 2); // explicit template parameters return 0; }
이 코드는 유형 삭제 및 템플릿을 활용하여 지도 내에서 다양한 시그니처를 사용하여 함수를 저장하고 호출하는 방법을 보여줍니다. 연산자().
위 내용은 C를 사용하여 지도에 다양한 서명이 있는 함수를 어떻게 저장할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!