Есть ли причина, по которой я не могу передать функтор сравнения map
в качестве аргумента конструктора:
map<int, string, greater<int>> foo;
//map<int, string> foo(greater<int>()); Doesn't work
Или почему я не могу передать лямбду, не предоставив свой собственный тип сравнения:
map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; });
//map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }); Doesn't work
Я хотел бы просто иметь возможность заявить map<int, string>
и построить его с помощью компаратора. Почему я не могу?
Этот вопрос проистекает из неправильного представления. Чтобы прояснить это:
Функторы являются объектами не функции
Попытка присвоить объекту указатель на функцию или лямбду не имеет никакого смысла. Так что это не может быть сделано: Способ определить map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; });
map
который принимает указатель на функцию или лямбда, чтобы использовать аргументы шаблона из вопроса: map<int, string, function<bool(const int&, const int&)>>
На полпути между двумя непродуманными вариантами в вопросе есть еще одно заблуждение: Не работает, потому что аргумент шаблона компаратора является тип члена map<int, string, [](const int& lhs, const int& rhs){ return lhs > rhs; }>
map
, не значение инициализации. Так что map
использование указателя функции или лямбда-компаратора всегда должно передавать это значение map
конструктор: map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; })
Иначе function<bool(const int&, const int&)>()
будет использоваться для сравнения в map
,
Это, вероятно, уже ясно сейчас, но поскольку функторы являются объектами, вы не можете передать несвязанный объект, это значение конструкции совершенно другого типа объекта. призвание это как звонить map<int, string> foo(greater<int>())
. Единственный допустимый аргумент конструктора компататора less<int> foo = greater<int>
map
чей аргумент шаблона компаратора является функтором, это то, что можно преобразовать в объект типа функтора в аргументе шаблона: map<int, string, greater<int>> foo(greater<int>{})
Это, очевидно, не нужно, потому что, если аргумент не был предоставлен и greater<int>
по умолчанию был построен тот же элемент инициализации map
приведет, так map<int, string, greater<int>>
достаточно.
Других решений пока нет …