首頁  >  文章  >  後端開發  >  如何使用 C 在映射中儲存具有不同簽名的函數?

如何使用 C 在映射中儲存具有不同簽名的函數?

Patricia Arquette
Patricia Arquette原創
2024-11-11 21:59:02436瀏覽

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

在映射中儲存具有不同簽名的函數

在此程式碼中,我們的目標是建立一個儲存具有不同簽章的函數的映射,利用字串作為鍵並通用方法作為值。

實作 Map

我們利用std::任何實現此目的的函式庫。透過將函數類型擦除到容器中,我們可以建立一個模板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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn