如何在C++中将可调用对象放入地图中?

How can I put a callable object into the map in C++?

本文关键字:对象 地图 调用 C++      更新时间:2023-10-16

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

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;
}

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

似乎您的 lambda 可以转换为的类型对于 MD5 和 CRC32std::function<std::string(std::string)>,对于 RSAstd::function<std::string(std::string, std::string)>。两者都与您在映射中定义的类型(即std::function<std::string()>(不匹配。

RSA 与其他产品之间的差异在您的设计中是一个真正的问题。例如,你应该如何编写如下所示的函数:

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

映射中的函数定义为:

std::function<std::string()

这意味着,不需要参数并返回一个 std::string... 您可以按照解决方法定义为将 2 个字符串作为参数,并忽略 MD5 和 CRC32 的 lambda 代码中的第二个字符串

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

--

FUNCS["MD5"] = [](std::string data, std::string) { return std::string("MD5 : ") + data; };
FUNCS["CRC32"] = [](std::string data, std::string) { 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;