如何在c ++ 0x中缓存lambda?

时间:2009-12-24 19:07:58

标签: c++ c++11 boost lambda tuples

我正在尝试使用C ++中的lambda使用它们。我目前有一个提升元组(这是真正简化的版本)。

typedef shared_ptr<Foo> (*StringFooCreator)(std::string, int, bool)
typedef tuple<StringFooCreator> FooTuple

然后我将全局命名空间中的函数加载到我的FooTuple中。理想情况下,我想用lambda替换它。

tuplearray[i] = FooTuple([](string bar, int rc, bool eom) -> {return shared_ptr<Foo>(new Foo(bar, rc, eom));});

我无法弄清楚lambda元组的函数签名是什么。它显然不是函数指针,但我无法弄清楚lambda的签名应该是什么。 lambda的资源现在都非常薄。我意识到C ++ 0x目前处于不稳定状态,但我很好奇如何让它工作。我也意识到有更简单的方法可以做到这一点,但我只是在玩C ++ 0x。我正在使用Intel 11.1编译器。

3 个答案:

答案 0 :(得分:7)

->运算符设置lambda的返回类型,在没有返回类型的情况下,可以省略它。此外,如果可以由编译器推断,则可以省略返回类型。就像Terry说的那样,你不能将lambda分配给函数指针(GCC不正确地允许这种转换)但是你可以使用std :: function。

此代码适用于GCC和VC10(从VC的包含中删除tr1 /):

#include <tr1/tuple>
#include <tr1/functional>
#include <tr1/memory>

using namespace std;
using namespace std::tr1;

class Foo{};
typedef function<shared_ptr<Foo>(string, int, bool)> StringFooCreator;
typedef tuple<StringFooCreator> FooTuple;

int main() {
    FooTuple f(
        [](string bar, int rc, bool eom) {
            return make_shared<Foo>();
        }
    );

    shared_ptr<Foo> pf = get<0>(f)("blah", 3, true);
}

答案 1 :(得分:3)

来自Visual C++ Blog

  

我提到将lambdas存储在   TR1 ::功能。但你不应该这样做   除非有必要,否则   tr1 :: function有一些开销。如果   你想重用一个lambda,或者简单地说   想给它一个名字,你可以使用   汽车。

答案 2 :(得分:1)

您应该能够在std :: function中存储lambda。在您的示例中,尝试将其存储在

std::function<std::shared_ptr<Foo>(std::string,int,bool)>

不要忘记自动(虽然你不能制作一系列汽车等)。