【问题标题】:How can I put a callable object into the map in C++?如何在 C++ 中将可调用对象放入地图中?
【发布时间】:2020-06-02 15:59:47
【问题描述】:

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

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

【问题讨论】:

  • 可能是因为 RSA 的签名与其他两个函数不同?
  • 我还看到在类型声明中只有一种类型。也许编译器理解该函数不带参数但返回一个字符串。也许它是一个只接受一个字符串但不返回任何内容的函数。那里有接受 2 个或 1 个字符串参数并返回另一个字符串的函数。一切都一团糟;我也不会编译
  • 我会考虑指定参数类型以及 std::function<:string>

标签: c++ function lambda


【解决方案1】:

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

对于 MD5 和 CRC32,您的 lambda 表达式可以转换为的类型似乎是 std::function&lt;std::string(std::string)&gt;,对于 RSA,它是 std::function&lt;std::string(std::string, std::string)&gt;。两者都不匹配您在地图中定义的类型,即std::function&lt;std::string()&gt;

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

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

【讨论】:

    【解决方案2】:

    您在地图中的功能定义为:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-15
      • 2017-06-26
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      相关资源
      最近更新 更多