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