>  기사  >  백엔드 개발  >  C의 맵에 다양한 시그니처가 있는 함수를 어떻게 저장할 수 있나요?

C의 맵에 다양한 시그니처가 있는 함수를 어떻게 저장할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-19 09:26:03352검색

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

맵에 다양한 서명이 있는 함수 저장

C에서는 맵에 다양한 서명이 있는 함수를 저장해야 할 수도 있습니다. 여기서 키는 문자열이고 값은 일반 메서드입니다. 처음에는 어려워 보일 수 있지만 유형 삭제 및 템플릿 연산자의 도움으로 가능합니다.

유형 삭제

지도에서 서로 다른 서명을 사용하여 기능을 저장하려면 , 먼저 컨테이너에 입력하여 삭제합니다. 여기에는 함수 유형을 지도에서 저장하고 검색할 수 있는 공통 표현으로 변환하는 작업이 포함됩니다.

템플릿 연산자

함수 유형이 삭제된 후, 우리는 지도에 대한 템플릿 연산자()를 제공합니다. 이 연산자는 저장된 함수를 입력으로 사용하고 런타임 시 특정 매개변수를 사용하여 호출할 수 있도록 해줍니다. 제공된 매개변수는 원래 함수 서명과 정확히 일치해야 합니다. 그렇지 않은 경우 연산자는 std::bad_any_cast 예외를 발생시킵니다.

다음은 이를 구현하는 방법의 예입니다.

#include <any>
#include <functional>
#include <map>
#include <string>
#include <iostream>

template<typename Ret>
struct AnyCallable
{
    //...
};

void foo(int x, int y)
{
    //...
}

void bar(std::string x, int y, int z)
{
    //...
}

using namespace std::literals;

int main()
{
    // Initialize the map
    std::map<std::string, AnyCallable<void>> map;

    // Store functions in the map
    map["foo"] = &foo;
    map["bar"] = &bar;

    // Call the stored functions with parameters
    map["foo"](1, 2);
    map["bar"]("Hello, std::string literal"s, 1, 2);
}

이 예에서는 함수를 유형 지우고 이를 호출하기 위한 템플릿 연산자()를 제공하는 래퍼 구조체 AnyCallable을 정의합니다.

고려 사항

  • 유형 삭제로 인해 원래 함수 서명과 정확하게 일치하는 매개변수를 지정해야 한다는 점에 유의하는 것이 중요합니다.
  • 매개변수가 일치하지 않는 저장 함수를 호출하려고 하면 연산자가 std를 발생시킵니다. :bad_any_cast 예외.

위 내용은 C의 맵에 다양한 시그니처가 있는 함수를 어떻게 저장할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.