在映射中存储具有不同签名的函数
在 C 中,使用字符串键和泛型函数作为值创建映射是一项挑战。然而,利用类型擦除和模板化运算符()的组合,这是可以实现的。
类型擦除允许在单个容器中存储不同的函数类型,而模板化运算符()提供对存储的函数。下面的代码示例演示了这种方法:
#include <any> #include <functional> #include <map> #include <string> template<typename Ret> struct AnyCallable { template<typename ... Args> Ret operator()(Args&& ... args) { ... } std::any m_any; }; void foo(int x, int y) { ... } void bar(std::string x, int y, int z) { ... } int main() { std::map<std::string, AnyCallable<void>> map; map["foo"] = &foo; map["bar"] = &bar; map["foo"](1, 2); map["bar"]("Hello", 1, 2); }
在此解决方案中,AnyCallable 类充当存储函数的包装器,提供模板化的operator()。函数指针 &foo 和 &bar 在存储到 m_any 成员之前会转换为 std::function 对象。当调用存储的函数时,它们会被转换为适当的函数类型并执行。
需要注意的是,由于类型擦除,必须在调用站点提供匹配的参数。此外,函数参数的常量性很重要,因为可以使用相同数量的参数但不同的限定符创建不同的重载。
以上是如何在 C 中的映射中存储具有不同签名的函数?的详细内容。更多信息请关注PHP中文网其他相关文章!