C++ 0x стиль кодирования лямбд

NetBeans имеет некоторую действительно серьезную поддержку Ruby.

22
задан Pavel Minaev 30 July 2009 в 00:24
поделиться

5 ответов

Здесь я вижу новое правило стандарта кодирования! ;)

Это немного надумано, но чтобы подчеркнуть «преимущество» явного, рассмотрим следующее:

void foo (std::vector<int> v, int x1)
{
  int sum = 0;
  std::for_each (v.begin ()
    , v.end ()
    , [&](int xl) { sum += x1; } 
}

Я специально выбрал для этого плохие имена и т. Д., Но это просто для иллюстрации сути. Если бы мы использовали явный список захвата, то приведенный выше код не скомпилировался бы, но в настоящее время он будет компилироваться.

В очень строгой среде (критичной с точки зрения безопасности) я могу видеть такое правило как часть стандарта кодирования.

0
ответ дан 29 November 2019 в 05:57
поделиться

Я бы пошел с явными списками захвата, когда это вообще возможно, когда вы хотите захватить много переменных тогда (вы, вероятно, делаете что-то не так и) вы можете использовать захват всех [&] список захвата.

Я считаю, что явные списки захвата являются идеальным вариантом, а неявных вариантов следует избегать и они существуют только для того, чтобы людям не приходилось набирать кучу кода, когда они действительно необходимы.

0
ответ дан 29 November 2019 в 05:57
поделиться

Моим первоначальным инстинктом было то, что захват по значению предлагает более или менее то же самое, что и анонимные внутренние классы Java, величина которых известна. Но вместо того, чтобы использовать трюк с массивом размера 1, когда вы хотите, чтобы охватывающая область видимости была изменяемой, вы можете вместо этого захватить по ссылке. В таком случае вы обязаны ограничить продолжительность лямбда рамками референса.

На практике я согласен с вами, что захват по ссылке должен быть по умолчанию при работе с алгоритмами, что, как я ожидаю, будет использоваться в большинстве случаев. Обычно анонимные внутренние классы в Java используются слушателями. В C ++ для начала меньше интерфейсов в стиле слушателя, поэтому потребность в этом меньше, но все же есть. В таком случае, возможно, будет лучше строго придерживаться принципа захвата по стоимости, чтобы избежать возможности ошибки.

2
ответ дан 29 November 2019 в 05:57
поделиться

Я никогда не слышал о правиле «явное правило лучше, чем неявное» , и я не согласен с этим. Конечно, есть случаи, когда это правда, но также много случаев, когда это не так. Вот почему 0x в конце концов добавляет вывод типа с ключевым словом auto . (и почему параметры шаблона функции уже определены, когда это возможно). Во многих случаях предпочтительнее неявное выражение.

Я еще не использовал лямбда-выражения C ++ (кроме как копаться в бета-версии VC10), но я бы пошел с последним большую часть времени

std::for_each(xs.begin(), xs.end(), [&](int x) { sum += x });

Мои рассуждения? Почему бы не сделать это? Это удобно. Оно работает. И это проще в обслуживании. Мне не нужно обновлять список захвата, когда я изменяю тело лямбды. Почему я должен открыто говорить о том, что компилятор знает лучше меня? Компилятор может определить список захвата на основе того, что фактически используется.

Что касается захвата по ссылке или значению? Я бы применил те же правила, что и для обычных функций. Если вам нужна ссылочная семантика, захватите по ссылке. Если вам нужна семантика копирования, сделайте это. Если любой из них подойдет, предпочтите значение для небольших типов и ссылку, если копирование стоит дорого.

Это не похоже на выбор, который вы должны сделать при разработке обычной функции.

Я, вероятно, должен прочитать спецификации лямбда-выражений, но разве это не основная причина для явных списков захвата, чтобы вы могли захватывать одни переменные по значению, а другие по ссылке?

6
ответ дан 29 November 2019 в 05:57
поделиться

Я читаю следующую ссылку, чтобы лучше понять лямбда-выражение C ++. Стиль кодирования, используемый в примерах, довольно изящный, и я могу следовать ему: http://uint32t.blogspot.com/2009/05/using-c0x-lambda-to-replace-boost-bind.html

0
ответ дан 29 November 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: