Существует проблема с вашим подходом, даже если вы можете определить лямбду так, как вы хотите.Взгляните на объявление multiset
:
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
> class multiset;
Обратите внимание, как каждый параметр шаблона является типом (используя ключевое слово class
).Теперь посмотрим, как вы пытались определить свой список:
using list = std::multiset<int, compare>;
^ ^
type value
Первый параметр хорош, но второй - несоответствие.Параметр Compare
должен быть типом, а не объектом.Одним из общих способов разрешения такой ситуации является замена compare
на decltype(compare)
, но, похоже, это не то, что вам нужно (плюс это проблематично для лямбда-типов).Кажется, вы хотите, чтобы построенный по умолчанию list
использовал compare
вместо простого созданного по умолчанию объекта того же типа.
Итак, вам нужен класс, чей построенный по умолчанию объект реализует operator()
вспособ, который дает заказ, который вы хотите.Поскольку мы имеем дело с int
, в стандартной библиотеке есть несколько готовых типов для этой цели, а именно std::less
и std::greater
.
using list = std::multiset<int, std::greater<int>>;
Однако я не могу перегрузить оператор(), std :: less, std :: большее.
Хмм ... это говорит о том, что пример кода мог быть упрощен, поскольку перегрузка не требуется.Хорошо, давайте предположим, что список имеет некоторый тип, с которым сложнее работать, скажем:
class I { /* Internals not important for this example. */ };
using list = std::multiset<I, ???>;
Если вам разрешено изменять I
, тогда самый простой подход может быть определением operator>
(илиoperator<
) для объектов типа I
.Поскольку std::greater
(или std::less
) использует этот оператор, вы получаете желаемый заказ из стандартного шаблона, не перегружая его.
Если вам не разрешено изменять I
, то я думаю, что выосталось написать собственный объект функции , так как это одна из ситуаций, когда лямбда неадекватна.К счастью, классы, реализующие функциональные объекты, легко написать;Лямбды вытесняют их в других ситуациях, главным образом потому, что лямбда-синтаксис имеет тенденцию быть более удобным.
struct CompareI {
bool operator() (const I & lhs, const I & rhs) const { return /* fill this in */; }
};
using list = std::multiset<I, CompareI>;
Хотя это определяет operator()
, это не перегрузка.Поэтому оно должно удовлетворять предъявляемым к вам требованиям.