> 백엔드 개발 > C++ > C를 사용하여 지도에 다양한 서명이 있는 함수를 어떻게 저장할 수 있나요?

C를 사용하여 지도에 다양한 서명이 있는 함수를 어떻게 저장할 수 있나요?

Patricia Arquette
풀어 주다: 2024-11-11 21:59:02
원래의
473명이 탐색했습니다.

How can I store functions with varying signatures in a map using C  ?

맵에 다양한 시그니처를 가진 함수 저장

이 코드에서는 문자열을 키로 활용하고 다양한 시그니처를 가진 함수를 저장하는 맵을 생성하는 것을 목표로 합니다. 일반적인 방법을 값으로 사용합니다.

Map 구현

우리는 이를 달성하려면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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