【问题标题】:How to define a map with lambdas as values in C++如何在 C++ 中使用 lambdas 定义映射作为值
【发布时间】:2021-03-11 20:21:38
【问题描述】:

我收到以下错误:

braced initialization of a variable declared with a placeholder type but without `=` requires exactly one element inside the braces
  const auto temperature_units{
    {"K", [] (double x)->double {return x;}},
    {"C", [] (double x)->double {return x+273.15;}},
    {"\u2103",  [] (double x)->double {return x+273.15;}}, // degree celcius symbol
    {"\u00B0C", [] (double x)->double {return x+273.15;}}, // degree symbol plus C
    {"F",  [] (double x)->double {return (x+459.67)*5.0/9.0;}},
    {"\u2109", [] (double x)->double {return (x+459.67)*5.0/9.0;}},// degree fahrenheit symbol
    {"\u00B0F", [] (double x)->double {return (x+459.67)*5.0/9.0;}}
  };

类似

  const std::map<std::string, auto> temperature_units{
    {"K", [] (double x)->double {return x;}},
    {"C", [] (double x)->double {return x+273.15;}},
    {"\u2103",  [] (double x)->double {return x+273.15;}}, // degree celcius symbol
    {"\u00B0C", [] (double x)->double {return x+273.15;}}, // degree symbol plus C
    {"F",  [] (double x)->double {return (x+459.67)*5.0/9.0;}},
    {"\u2109", [] (double x)->double {return (x+459.67)*5.0/9.0;}},// degree fahrenheit symbol
    {"\u00B0F", [] (double x)->double {return (x+459.67)*5.0/9.0;}}
  };

也不起作用,因为那显然是error: invalid use of ‘auto。我不知道该怎么写,就像apparently lambdas do not have a defined type

【问题讨论】:

  • Lambda 可能没有定义的类型,但在您的情况下它们可以转换为 std::function&lt;double, double&gt;。将其用作地图中的类型。
  • @Blindy 感谢在这种情况下有效 - 是否还有更一般的答案?我猜你很少会在你可能想要捕捉某些东西的块内定义地图
  • 这是一般的答案,即使捕获 lambdas 也可以转换为 std::function&lt;&gt;。这适用于每一种情况,也许与这个问题无关,但同样的事情在 C# 中也适用(只有 Action&lt;&gt;Func&lt;&gt;),我在每个项目中至少使用了几次。
  • 如果您从不打算使用捕获 lambda,您可以使用指向函数的指针,但是如果 lambda 的签名可能不完全匹配或者您需要使用捕获一个,那么除了 std::functionI 之外别无选择害怕。
  • std::map&lt;std::string, std::function&lt;double(double)&gt;&gt;godbolt.org/z/644Phj

标签: c++ lambda


【解决方案1】:
using namespace std::literals;


    const std::map temperature_units {
        std::make_pair("K"s, std::function<double(double)>{[] (double x)->double {return x;}}),
        {"C"s, [] (double x)->double {return x+273.15;}},
        {"\u2103"s,  [] (double x)->double {return x+273.15;}}, // degree celcius symbol
        {"\u00B0C"s, [] (double x)->double {return x+273.15;}}, // degree symbol plus C
        {"F"s,  [] (double x)->double {return (x+459.67)*5.0/9.0;}},
        {"\u2109"s, [] (double x)->double {return (x+459.67)*5.0/9.0;}},// degree fahrenheit symbol
        {"\u00B0F"s, [] (double x)->double {return (x+459.67)*5.0/9.0;}}
    };

https://godbolt.org/z/M5er48 一些变化https://godbolt.org/z/ozqG56

所以基本上问题是强制执行正确类型的初始化列表。

【讨论】:

  • 我看不出它比用正确的类型声明std::map 更好。我很容易看出情况会更糟。
  • 我认为这是 OP 希望自动推断地图参数类型的愿望。
猜你喜欢
  • 2010-10-28
  • 2018-07-22
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多