首页 >后端开发 >C++ >如何使用 C 在映射中存储具有不同签名的函数?

如何使用 C 在映射中存储具有不同签名的函数?

Patricia Arquette
Patricia Arquette原创
2024-11-11 21:59:02473浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn