Felix Benning
Felix Benning

Reputation: 1182

How to define a map with lambdas as values in C++

I am getting the following error:

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

Something like

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

also does not work as that is error: invalid use of ‘auto apparently. I am not sure how else to write this, as apparently lambdas do not have a defined type

Upvotes: 0

Views: 61

Answers (1)

Marek R
Marek R

Reputation: 37607

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 some variation https://godbolt.org/z/ozqG56

So basically problem is to enforce proper type of initialization list.

Upvotes: 1

Related Questions