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

时间:2014-10-24 03:29:20

标签: c++ lambda

我之前有很多C#经验,但我是C ++的新手。当我尝试使用lambda时,我已经看到了这个问题。

例如:

auto compare = [] (int i1, int i2) { return i1*2 > i2; }

有没有办法用特定的类型定义lambda,而不是自动扣除?

我问这个是因为我想为我的班级定义一个普通的lambda。这个lambada将在多个地方使用,所以我不想多次定义它们。但是,' auto'只能在静态成员上使用,而另一方面,我想访问lambda中的非静态字段。

4 个答案:

答案 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作为工具可以帮助您避免重复自己,而不必害怕使用它们,从而使您作为程序员的工作更加轻松。