Лямбда функции с использованием плейсходера

shalak.dan
shalak.dan
std::vector<int> v;
int x = 0;
int y = 10;

using namespace boost::lambda;

std::vector<int>::iterator i = find_if( v.begin(), v.end(), [=](int a) { return a > x && a < y; });

подобную запись можно переписать заменив тип аргумента лямбда функции на auto, а раз тип аргумента известен, то в некоторых ситуациях можно было бы опустить его вообще.

Запись предложенная Александреску, конечно не стала бы полноценной заменой, но вполне могла бы быть интересной синтаксической фичей для лямбда функций.

-4
рейтинг
9 комментариев
shalak.dan
Невнимательно написал пост.

В Стандартах кодирования на c++ версия такая:
using namespace boost::lambda;
std::vector<int>::iterator i = find_if( v.begin(), v.end(), _1 > x && _1 < y);

Сейчас поддерживается только такая:
std::vector<int>::iterator i = find_if( v.begin(), v.end(), [=](int a) { return a > x && a < y; });
shalak.dan
yndx-antoshkka
shalak.dan, лямбды вида "_1 > x && _1 < y" поломают пользовательский код (например код с boost::lambda который с вы привели в начале).

Нужен синтаксис, который ничего не сломает, иначе в стандарт С++ не примут.
yndx-antoshkka
ru.night.beast
yndx-antoshkka, $1 ну или arg[1] который делает некое магическое lambdaexpr
ru.night.beast
shalak.dan
yndx-antoshkka, а можете пояснить что именно будет сломано, я не понял?
shalak.dan
yndx-antoshkka
shalak.dan, вместо 'boost::lambda::_1' будет использоваться ключевое слово '_1'. Все библиотеки, где используется _1 могут потенциально поломаться (Boost.Bind, Boost.Phoenix и т.д.).

Можно пойти путём библиотеки Boost.Lambda и добавить функциональности для std::_1. То есть воплотить ваше предложение на уровне библиотеки, а не языка.

Но тогда мы получим все недостатки Boost.Lambda: нечитаемые сообщения об ошибках, сложно-обнаружимые проблемы, плохая интеграция со сторонними библиотеками... Мне не кажется что международный комитет захочет в ближайшее время заниматься подобным предложением, т.к. оно очень ресурсозатратно а в приоритетах сейчас Ranges, Networking и Concurrency.
yndx-antoshkka
shalak.dan
yndx-antoshkka, да, скорее всего вы правы.
shalak.dan
Михаил Мальцев
На эту тему есть предложение open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0573r0.html
Михаил Мальцев
Antervis
а что мешает сделать implicit auto для аргументов лямбда-функций по аналогии с implicit auto для захвата? аля auto func = [](x,&y) { y = x; };
Antervis
shalak.dan
Antervis, ничего не мешает, просто увидел подобную запись в книжке и мне она показалась достаточно изящной.
shalak.dan
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).