繁体   English   中英

我可以在没有 auto 的情况下定义 C++ lambda 函数吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM