Нет, вы не можете поместить его в decltype
, потому что
Лямбда-выражение не должно появляться в неоцененном операнде
Вы можете сделать следующее, хотя
auto n = [](int l, int r) { return l > r; };
std::set<int, decltype(n)> s(n);
Но это действительно ужасно. Обратите внимание, что каждое лямбда-выражение создает новый уникальный тип. Если впоследствии вы делаете следующее где-то еще, t
имеет тип, отличный от s
auto n = [](int l, int r) { return l > r; };
std::set<int, decltype(n)> t(n);
Вы можете использовать std::function
здесь, но учтите, что это потребует незначительных затрат времени выполнения, поскольку требует косвенного вызова оператора вызова объекта функции лямбда-выражения. Это, вероятно, незначительно здесь, но может быть важно, если вы хотите передать функциональные объекты таким образом, например, к std::sort
.
std::set<int, function<bool(int, int)>> s([](int l, int r) { return l > r; });
Как всегда, сначала код, затем профиль:)