在映射中存储具有不同签名的函数
在 C 中,您可能会遇到需要在映射中存储具有不同签名的函数,其中键是字符串,值是通用方法。虽然这最初看起来可能具有挑战性,但在类型擦除和模板运算符的帮助下是可能的。
类型擦除
启用在映射中存储具有不同签名的函数,我们首先将它们键入擦除到容器中。这涉及将函数类型转换为可以在映射中存储和检索的通用表示形式。
模板运算符
一旦函数类型被类型擦除,我们为地图提供了一个模板运算符 ()。该运算符将存储的函数作为输入,并允许我们在运行时使用特定参数调用它。提供的参数必须与原始函数签名完全匹配。如果不这样做,运算符将抛出 std::bad_any_cast 异常。
示例
以下是如何实现的示例:
#include <any> #include <functional> #include <map> #include <string> #include <iostream> template<typename Ret> struct AnyCallable { //... }; void foo(int x, int y) { //... } void bar(std::string x, int y, int z) { //... } using namespace std::literals; int main() { // Initialize the map std::map<std::string, AnyCallable<void>> map; // Store functions in the map map["foo"] = &foo; map["bar"] = &bar; // Call the stored functions with parameters map["foo"](1, 2); map["bar"]("Hello, std::string literal"s, 1, 2); }
在此示例中,我们定义了一个包装结构 AnyCallable,它可以对函数进行类型擦除,并提供模板运算符 () 来调用它们。
注意事项
以上是如何在 C 的映射中存储具有不同签名的函数?的详细内容。更多信息请关注PHP中文网其他相关文章!