Можно ли использовать лямбду только локально?

Можно ли определить лямбда-функцию, которая будет использоваться только локально, то есть в текущем блоке (функция / метод)? Рассмотрим ситуацию, когда некоторый код будет выполняться несколько раз (поэтому было бы логично поместить его в функцию), но он никогда не будет использоваться вне блока.

void foo() {
auto bar = []() {
// some code applicable only inside foo()
};

bar();
bar();
bar();
}

Каковы преимущества и недостатки этого подхода по сравнению с bar() объявлен как нормальная функция?

8

Решение

Если опция для этого доступна, тогда да, локализуйте лямбду bar к конкретной функции.

В C ++ мы всегда стараемся поддерживать объекты как можно более локальными. (Делает код легче следовать, упрощает документирование, облегчает рефакторинг, &с. &с ..)

15

Другие решения

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

void foo()
{
// introduce actors here
auto something = make_something();

// introduce detailed definitions
auto bing = [&]()->bool { ... };  // define what binging means

auto bong = [&]() { ... };  // define what bonging means

// perform logic
while (bing())
bong();
}

Помните, что с c ++ 17 лямбды constexpr по умолчанию. gcc et. и др. часто оптимизировать их полностью. Ничто из этого не является соображением производительности.

10

Ты можешь это сделать. Главный вопрос, будет ли это более читабельным? Помещение этого снаружи сохраняет один уровень отступа.

Вопросы, которые вы должны задать:

  1. Функция короткой штанги?
  2. Это чистая функция или что-то изменяет?
  3. Это тесно связано с Foo, или может быть использовано в другом месте?
  4. Хотите другой уровень отступа?
5

С правильной / стандартной точки зрения это, конечно, хорошо. Выходя за рамки этого, этот вопрос в значительной степени основывается на мнении.

Лямбды являются одним из многих инструментов в C ++. Они добавляют еще один слой структуры между «копировать-вставить для повторного использования» (запах кода) и «извлечь его в функцию». Лично мне нравятся локальные лямбды-функции для точно указанной цели: вы повторно используете небольшой фрагмент кода, который имеет смысл только в этой области функций.

Есть аргументы в пользу того, что она все еще должна быть своей собственной функцией (потому что все ваши функции — 5 строк или короче, верно? Ну, я сомневаюсь в этом …). В частности, если вы хотите повторно использовать этот лямбда-код, он должен определенно быть своей собственной функцией. Но перед этим стоит подумать о пользе этого кода прямо там рядом с тем, где он используется, вместо экрана или более прокрутки. Кроме того, оба подхода дают имя операции, но лямбда требует меньше накладных расходов для записи (например, разветвленная функция закрытого члена). На той же странице добавление закрытой функции-члена в заголовок вызывает перекомпиляцию, добавляя лямбду в .cpp не.

В конце подумайте, что сделает код наиболее читабельным. Если разница в ясности кода между использованием лямбды или извлечением ее в функцию невелика (не маловероятна), то удобство пишу код начинает иметь значение, для чего в игру вступают вышеупомянутые соображения.

Что касается тестирования, это зависит от того, насколько мелкозернистым вы хотите протестировать. Нравится ли лямбда-выражение return a && b && (a == b); действительно нужен тест? Вы бы проверили его, если бы он был просто встроенным (т.е. не извлекался как лямбда или функция)? В какой-то момент это становится пустой тратой времени, но определить этот момент невозможно в SO-ответе.

5

В этом нет ничего плохого, на самом деле это одно большое преимущество лямбд: вы можете определять их локально там, где они вам нужны, вместо того, чтобы писать тип функтора. Если вам нравится определять / объявлять ваши вещи в максимально узкой области, то лямбды — ваш друг.

Вы даже можете сделать еще один шаг и сделать что-то вроде этого:

 auto bar = []() {return true;}();

который определяет лямбду и вызывает ее, все в одной строке.

4
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector