是否可以更改此代码以避免使用C++lambda表达式
Is it possible to change this code in order to avoid the use of the C++ lambda expression?
我有这段代码,我想知道是否可以更改它以避免使用lambda表达式:
#include <vector>
#include <algorithm>
#include <iterator>
class B
{
public:
B( double b ):b_(b){}
double b_;
};
class A
{
public:
double error( const B& b ) const {return a_-b.b_;};
double a_;
};
int main(int argc, char* argv[])
{
std::vector< B > bs;
std::vector< double > ds;
A a;
a.a_ = 10;
bs.push_back( B(1) );
bs.push_back( B(2) );
bs.push_back( B(3) );
std::transform( bs.begin(), bs.end(),
std::back_inserter( ds ),
[&a](const B& b){return a.error(b);} );
return 0;
}
我想保留std::transform
,但不保留lambda。
是。就像我们多年来在C++03中所做的那样:使用函数对象。
std::transform
(以及类似算法)的大多数(如果不是全部的话)参考文献都有这样的例子。
在这种情况下,等价的函子是:
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));
请注意,lambda捕获的任何内容都需要函子的相应数据成员。因此,"捕获所有内容"lambda有点棘手,因为您需要计算lambda实际使用的变量。lambda为您做的另一件事是,在lambda主体由单个返回语句组成的情况下,它会自动计算出返回类型。
可能包含语法或打字错误
double fn(const A &a, const B &b) {
return a.error(b);
}
....
using std::placeholders::_1;
std::transform( bs.begin(), bs.end(),
std::back_inserter( ds ),
boost::bind(fn, a, _1) );
只需拼写Tomalak的答案:
struct ErrorFunctor {
double a;
ErrorFunctor(double a) : a(a) { }
inline double operator()(const B & b) const { return a - b.b_; }
};
// ... later on ...
std::transform(bs.begin(), bs.end(), std::back_inserter(ds), ErrorFunctor(10));
必须通过operator()
访问函数对象的工作。
相关文章:
- 这 4 个 lambda 表达式之间有什么区别?
- 使用成员在类中创建 lambda 表达式
- 将 lambda 表达式传递给 std::function in C++
- 在 lambda 表达式中使用 std::atomic
- &&对lambda表达式有什么好处?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 列表.erase 中的 lambda 表达式
- 使用 lambda 表达式的 Raspbian G++ 8.3.0 导致 ']' 之前的预期主表达式 - 即使标准设置为 c++14
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- C++: priority_queue:模板参数中的 lambda 表达式
- 容器如何处理 lambda 表达式的参数
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 如何在 lambda 表达式中传递变量?
- 针对 std::function 的 lambda 表达式和模板推导:为什么会这样?
- 如何修改Lambda表达式以将输出放入文本文件
- C++如何使用lambda表达式来捕获上一次迭代的值
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- C++:从捕获函数参数的函数返回 lambda 表达式
- C++ Lambda 表达式:通过 ref 开销捕获
- Qt 连接无法识别 lambda 表达式