c++ - 如何将可调用对象放入 C++ 中的映射中?

标签 c++ function lambda

我很困惑为什么它不能以这种方式使用。有没有办法实现类似这样的函数调用?我很困惑为什么不能这样使用。有没有办法实现类似这样的函数调用?

std::map<std::string, std::function<std::string()>> FUNCS;

void test_map_operator()
{
    FUNCS["MD5"] = [](std::string data) { return std::string("MD5 : ") + data; };
    FUNCS["CRC32"] = [](std::string data) { return std::string("CRC32 : ") + data; };
    FUNCS["RSA"] = [](std::string data, std::string key) { return std::string("RSA : ") + data + key; };

    std::cout << FUNCS["MD5"]("hello") << std::endl;
    std::cout << FUNCS["CRC32"]("hello") << std::endl;
    std::cout << FUNCS["RSA"]("hello","world") << std::endl;
}

最佳答案

您可以像处理任何其他数据一样将可调用对象放入 map 或其他容器中:它们必须属于同一类型。

看起来你的 lambda 可以转换成的类型是 std::function<std::string(std::string)>对于 MD5 和 CRC32,它是 std::function<std::string(std::string, std::string)>对于RSA。两者都不匹配您在 map 中定义的类型,即 std::function<std::string()> .

RSA 与其他算法之间的区别是您设计中的一个真正问题。例如,您应该如何编写如下函数:

std::string format_data(std::string algo, std::string data)
{
    return FUNCS[algo](data, ¿¿¿ maybe also "some key" ???);
}

关于c++ - 如何将可调用对象放入 C++ 中的映射中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62156183/

相关文章:

c++ - 为什么使用两个 sizeof 来检查一个类是否是默认可构造的,而一个却不行?

c++ - 如何可移植地将 std::system_error 异常与 std::errc 值进行比较?

python - lambda 函数如何获得它的值?

linq - 如何转换此 linq 表达式?

C++ 重构预编译头文件

c++ - 如何根据当前语言环境格式设置在 SQLite 中格式化日期?

c++ - 内联函数 - 它们与 inline 关键字相比究竟是什么?

javascript - 有没有一种简单的方法可以让函数获取调用它的标签的 ID?

arrays - 如何从 Golang 中的不同函数将一个数组的元素复制到另一个数组

c# - Expression.ToString() 有效吗?