首页 > 后端开发 > C++ > 如何在 C 语言的映射中存储具有非齐次签名的函数?

如何在 C 语言的映射中存储具有非齐次签名的函数?

Linda Hamilton
发布: 2024-11-18 07:53:02
原创
259 人浏览过

How Can You Store Functions with Non-Homogeneous Signatures in a Map in C  ?

在映射中存储具有非齐次签名的函数

问题介绍

在 C 中,需要将具有不同签名的函数与唯一的关联起来基于运行时参数的动态调用的标识符。然而,标准容器不直接支持非同质函数类型的存储。

利用类型擦除和模板运算符

克服此限制的一种方法是类型擦除,其中涉及封装函数将类型放入容器中,该容器会删除特定类型信息。这允许统一存储具有不同签名的函数。为了促进这个过程,定义了一个自定义数据结构 AnyCallable:

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;
};
登录后复制

AnyCallable 接受异构函数类型并提供通用的operator()来调用具有匹配参数的封装函数。

示例实现

使用 AnyCallable 数据结构,我们现在可以创建一个存储具有不同签名的函数的映射:

std::map<std::string, AnyCallable<void>> map;
map["foo"] = &foo;
map["bar"] = &bar;
登录后复制

根据函数的唯一字符串标识符动态调用函数,我们利用 AnyCallable 提供的operator():

map["foo"](1, 2);
map["bar"]("Hello", 1, 2);
登录后复制

这种方法确保了类型安全和具有非同质签名的函数的动态调用,使其成为存储和执行具有不同输入的方法指针的通用解决方案。

以上是如何在 C 语言的映射中存储具有非齐次签名的函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板