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

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

在 C# 中大量使用 lambda 之后,我尝试在 C++ 中使用它们。我目前有一个 boost 元组(这是真正简化的版本)。

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 编译器。

最佳答案

->操作符设置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);
}

关于c++ - 如何在 C++0x 中缓存 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1959418/

相关文章:

c++ - 以 C++11 方式重写 boost 风格的代码(Boost.Bind、Boost.Function)

c++ - 如何从 boost::ptr_vector 中删除 "this"

c++ - OpenNI 链接错误,大量 undefined reference

c++ - Qt- QNetworkReply 不显示 Content-Length header

c++ - 通过 ctor 右值参数的 Lambda 赋值

c++ - 编写条件可选构造函数的最佳方法

c++ - strand.post 和 strand.wrap 的性能区别是什么?

c++ - Visual Studio 运行时检查失败 #2 - 变量 'temp' 周围的堆栈已损坏

c++ - 保持屏幕打开

c++ - 正确分配 vector 中的内存