Можно ли выразить «тип» лямбда-выражения?
=========================================

Думая о лямбда-выражениях как о «синтаксическом сахаре» для вызываемых объектов, можно ли выразить безымянный базовый тип?

Пример:

Сейчас,`[](int l, int r) { return l > r; }` элегантная замена приведенному выше коду (плюс необходимое создание вызываемых объектов gt), но есть ли способ выразить сам gt (тип)?

Простое использование:

Нет, вы не можете положить это в`decltype` так как

Лямбда-выражение не должно появляться в неоцененном операнде

Вы можете сделать следующее, хотя

Но это действительно ужасно. Обратите внимание, что каждое лямбда-выражение создает новый уникальный тип. Если потом вы делаете следующее где-то еще,`t` имеет другой тип, чем`s`

Ты можешь использовать`std::function` здесь, но обратите внимание, что это потребует незначительных затрат времени выполнения, поскольку требует косвенного вызова оператора вызова объекта функции лямбда-выражения. Это, вероятно, незначительно здесь, но может быть важно, если вы хотите передать функциональные объекты таким способом`std::sort` например.

Как всегда, сначала код, потом профиль :)



Вы можете использовать небольшой класс lambda\_wrapper <>, чтобы обернуть лямбду с небольшими затратами. Это намного быстрее, чем std :: function, потому что нет вызова виртуальной функции и динамического выделения памяти. Оболочка работает, выводя список аргументов лямбда и тип возвращаемого значения.



По крайней мере, в Microsoft Visual Studio (я не пробовал это с другими компиляторами), и если вы ничего не захватываете, тип выглядит как обычный указатель на функцию:



Прямой ответ на ваш вопрос: Нет.

Вам нужно будет использовать то, что можно назначить из любого типа, напоминающего функтор, который имеет четко определенный тип. Одним из примеров является std :: function, как показано в ответе sbi. Это не тип лямбда-выражения.