Подтвердить что ты не робот

Можно ли использовать функцию лямбда для параметра шаблона?

Я смотрел на std:: unordered_map и увидел, что если бы я хотел использовать строку в качестве ключа, мне пришлось бы создать класс, содержащий функтор.

Из любопытства мне было интересно, можно ли использовать лямбда вместо этого.

Здесь рабочий оригинал:

struct hf
{
  size_t operator()(string const& key) const
  {
    return key[0];  // some bogus simplistic hash. :)
  }
}

std::unordered_map<string const, int, hf> m = {{ "a", 1 }};

Здесь моя попытка:

std::unordered_map<string const, int, [](string const& key) ->size_t {return key[0];}> m = {{ "a", 1 }};

Не удалось выполнить следующие ошибки:

exec.cpp: In lambda function:
exec.cpp:44:77: error: ‘key’ cannot appear in a constant-expression
exec.cpp:44:82: error: an array reference cannot appear in a constant-expression
exec.cpp: At global scope:
exec.cpp:44:86: error: template argument 3 is invalid
exec.cpp:44:90: error: invalid type in declaration before ‘=’ token
exec.cpp:44:102: error: braces around scalar initializer for type ‘int’

Учитывая ошибки, казалось бы, что ламба отличается от функтора настолько, что делает это не постоянным выражением. Это правильно?

4b9b3361

Ответ 1

Способ передачи лямбда-функции:

auto hf = [](string const& key)->size_t { return key[0]; };

unordered_map<string const, int, decltype(hf)> m (1, hf);
                                 ^^^^^^^^^^^^        ^^
                                 passing type        object

Вывод decltype(hf) - это тип класса, который не имеет конструктора по умолчанию (он удаляется =delete). Итак, вам нужно передать объект конструктором unordered_map, чтобы он мог построить лямбда-объект.