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