[英]Can I define a C++ lambda function without auto?
我以前有很多 C# 经验,但我是 C++ 新手。 我在尝试使用 lambda 时遇到过这个问题。
例如:
auto compare = [] (int i1, int i2) { return i1*2 > i2; }
有没有办法用特定类型定义 lambda,而不是自动推导?
我问这个是因为我想为我的班级定义一个通用的 lambda。 这个 Lambada 将在多个地方使用,所以我不想多次定义它们。 但是,'auto' 只能用于静态成员,而另一方面,我想访问 lambda 中的非静态字段。
您使用std::function
,它可以对任何 lambda 或函数指针进行 glob。
std::function< bool(int, int) > myFunc = []( int x, int y ){ return x > y; };
请参阅C++ 参考。
您可以使用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);
如上所述,您可以使用 as std::function<Signature>
,但以类型擦除 lambda 为代价。 当您调用 lambda 时,这将添加一个间接(基本上是一个虚函数调用)。 因此请记住,如果您将在重要的上下文中使用它,效率会降低。
在没有std::function
开销的情况下执行此操作的方法是,如果您觉得函子太麻烦,则可以使用函数指针、typedef 和可选的宏。
在您的示例中,此函数指针如下所示:
bool (*compare)(int, int) = [] (int i1, int i2) { return i1*2 > i2; };
^^^^^^^^^^^^^^^^^^^^^^^^^
请注意,指针的标识符compare
是如何塞进括号中的,这有时会让人们感到困惑,但这是声明函数指针的正确方法。
你可以用同样的方式写一个 typedef:
typedef bool (*Compare)(int, int);
typedef 名称是标识符通常所在的位置。 这使您现在可以编写更简洁的内容:
Compare func = [] (int i1, int i2) { return i1*2 > i2; };
^^^^^^^^^^^^
如果您允许自己使用宏,您可以在人体工程学方面走得更远:
#define CompareLambda [](int i1, int i2)
typedef bool (*Compare)(int, int);
...
Compare func = CompareLambda{ return i1*2 > i2;};
宏和 typedef 作为工具存在,通过帮助您避免重复自己,使您作为程序员的工作更轻松,不要害怕使用它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.