在C#中使用它们后,我正在尝试使用lambda中的lambda.我目前有一个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编译器.
解决方法
– > operator设置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,bool)> StringFooCreator; typedef tuple<StringFooCreator> FooTuple; int main() { FooTuple f( [](string bar,bool eom) { return make_shared<Foo>(); } ); shared_ptr<Foo> pf = get<0>(f)("blah",3,true); }