我之前有很多C#经验,但我是C ++的新手。当我尝试使用lambda时,我已经看到了这个问题。
例如:
auto compare = [] (int i1, int i2) { return i1*2 > i2; }
有没有办法用特定的类型定义lambda,而不是自动扣除?
我问这个是因为我想为我的班级定义一个普通的lambda。这个lambada将在多个地方使用,所以我不想多次定义它们。但是,' auto'只能在静态成员上使用,而另一方面,我想访问lambda中的非静态字段。
答案 0 :(得分:9)
使用std::function
,它可以对任何lambda或函数指针进行计算。
std::function< bool(int, int) > myFunc = []( int x, int y ){ return x > y; };
请参阅C++ Reference。
答案 1 :(得分:4)
你可以使用std::function
,但是如果这不够高效,你可以编写一个类似lambdas幕后操作的仿函数对象:
auto compare = [] (int i1, int i2) { return i1*2 > i2; }
与
几乎相同struct Functor {
bool operator()(int i1, int i2) const { return i1*2 > i2; }
};
Functor compare;
如果仿函数应该在上下文中捕获一些变量(例如“this”指针),则需要在仿函数中添加成员并在构造函数中初始化它们:
auto foo = [this] (int i) { return this->bar(i); }
与
几乎相同struct Functor {
Object *that;
Functor(Object *that) : that(that) {}
void operator()(int i) const { return that->bar(i); }
};
Functor foo(this);
答案 2 :(得分:0)
您可以像上面提到的那样使用std::function<Signature>
,但代价是擦除lambda的类型。当你调用lambda时,这将添加一个间接(基本上是一个虚函数调用)。所以请记住,如果你在一个重要的环境中使用它,效率会降低。
答案 3 :(得分:0)
如果感觉函子太麻烦了,那么不用products
的开销就能做到这一点,那就是使用函数指针,一个typedef和一个可选的宏。
在您的示例中,此函数指针如下所示:
stock
请注意,指针的标识符Product
是如何插入括号中的,这有时会使人绊倒,但这是声明函数指针的正确方法。
您可以用相同的方式编写typedef:
std::function
typedef名称通常是标识符所在的位置。现在,您可以写得更简洁:
bool (*compare)(int, int) = [] (int i1, int i2) { return i1*2 > i2; };
^^^^^^^^^^^^^^^^^^^^^^^^^
如果您允许自己使用宏,则可以在人机工程学方面走得更远:
compare
宏和typedef作为工具可以帮助您避免重复自己,而不必害怕使用它们,从而使您作为程序员的工作更加轻松。