Оставаясь в границах языка и библиотек C ++, я бы предложил сначала привыкнуть к программированию с использованием шаблонов функций алгоритма STL, так как одним из наиболее распространенных вариантов использования boost :: lambda является замена классов функторов на встроенные выражения. встраиваются.
Сама документация библиотеки дает вам предварительный пример того, для чего она нужна:
for_each(a.begin(), a.end(), std::cout << _1 << ' ');
где std::cout << _1 << ' '
создает объект функции, который при вызове записывает свой первый аргумент в поток cout
. Это то, что вы могли бы сделать с пользовательским классом функторов, std::ostream_iterator
или явным циклом, но boost :: lambda выигрывает в краткости и, вероятно, ясности - по крайней мере, если вы привыкли к концепциям функционального программирования.
Когда вы (чрезмерно) используете STL, вы обнаруживаете, что тяготеете к boost :: bind и boost :: lambda. Это очень удобно для таких вещей, как:
std::sort( c.begin(), c.end(), bind(&Foo::x, _1) < bind(&Foo::x, _2) );
Прежде чем вы достигнете этой точки, не так уж много. Поэтому используйте алгоритмы STL, пишите свои собственные функторы, а затем переводите их во встроенные выражения, используя boost :: lambda.
С профессиональной точки зрения, я считаю, что лучший способ начать работу с boost :: lambda - это понять и принять использование boost :: bind. Использование заполнителей в выражении boost :: bind выглядит гораздо менее волшебным, чем «голые» заполнители boost :: lambda, и их легче воспринимать при проверке кода. Выход за рамки базового повышения :: лямбда вполне может вас огорчить от коллег, если вы не в передовом магазине C ++.
Старайтесь не выходить за борт - 1018 * случаев * и 1010 * бывают в тех случаях, когда for
-петл действительно является правильным решением.