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

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

Susan Sarandon
Susan Sarandon原创
2024-11-19 09:26:03402浏览

How can I store functions with varying signatures in a map in C  ?

在映射中存储具有不同签名的函数

在 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,它可以对函数进行类型擦除,并提供模板运算符 () 来调用它们。

注意事项

  • 需要注意的是,由于类型擦除,您必须指定与原始函数签名完全匹配的参数。
  • 如果您尝试使用不匹配的参数调用存储函数,则运算符将抛出 std: :bad_any_cast 异常。

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

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