В этом случае эквивалентный функтор имеет вид:
struct CallError {
A &a;
CallError(A &a) : a(a) {}
double operator()(const B &b) { return a.error(b); }
};
Затем:
std::transform( bs.begin(), bs.end(),
std::back_inserter( ds ),
CallError(a));
Обратите внимание, что для захвата лямбда-выражения требуется соответствующий элемент данных функтора.Поэтому лямбды «захватывать все» немного сложнее, так как вам нужно выяснить, какие переменные действительно использует лямбда.Еще одна вещь, которую лямбда делает для вас, в этом случае, когда лямбда-тело состоит из одного оператора return, это то, что он автоматически определяет тип возвращаемого значения.