Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c++;0x? 我尝试在C++中使用lambda,在C语言中使用了大量的内容。我目前有一个boost元组(这是真正简化的版本) typedef共享\u ptr(*StringFooCreator)(std::string,int,bool) typedef元组FooTuple_C++_C++11_Boost_Lambda_Tuples - Fatal编程技术网

如何在c++;0x? 我尝试在C++中使用lambda,在C语言中使用了大量的内容。我目前有一个boost元组(这是真正简化的版本) typedef共享\u ptr(*StringFooCreator)(std::string,int,bool) typedef元组FooTuple

如何在c++;0x? 我尝试在C++中使用lambda,在C语言中使用了大量的内容。我目前有一个boost元组(这是真正简化的版本) typedef共享\u ptr(*StringFooCreator)(std::string,int,bool) typedef元组FooTuple,c++,c++11,boost,lambda,tuples,C++,C++11,Boost,Lambda,Tuples,然后,我将全局名称空间中的一个函数加载到我的FooTuple中。理想情况下,我想用lambda替换这个 tuplearray[i] = FooTuple([](string bar, int rc, bool eom) -> {return shared_ptr<Foo>(new Foo(bar, rc, eom));}); tuplearray[i]=FooTuple([](字符串条,int-rc,bool-eom)->{return-shared_-ptr(新Foo(条,

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

tuplearray[i] = FooTuple([](string bar, int rc, bool eom) -> {return shared_ptr<Foo>(new Foo(bar, rc, eom));});
tuplearray[i]=FooTuple([](字符串条,int-rc,bool-eom)->{return-shared_-ptr(新Foo(条,rc,eom));};

我不知道lambda元组的函数签名应该是什么。它显然不是函数指针,但我不知道lambda的签名应该是什么。lambda's的资源目前都非常有限。我意识到C++0x目前正在不断变化,但我很好奇如何让它工作。我也意识到有更简单的方法可以做到这一点,但我只是在玩C++0x。我使用的是英特尔11.1编译器。

运算符设置lambda的返回类型,如果没有返回类型,则可以忽略它。此外,如果编译器可以推断它,则可以省略返回类型。正如Terry所说,不能将lambda分配给函数指针(GCC不允许这种转换),但可以使用std::function

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

#包括
#包括
#包括
使用名称空间std;
使用名称空间std::tr1;
类Foo{};
typedef函数StringFooCreator;
typedef元组FooTuple;
int main(){
英尺级f(
[](字符串条、int-rc、bool-eom){
返回make_shared();
}
);
shared_ptr pf=get(f)(“blah”,3,true);
}

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

std::function

不要忘记汽车(尽管你将无法制作一系列汽车等)。

我提到了将lambdas存储在 tr1::函数。但你不应该这样做 除非有必要,否则 tr1::函数有一些开销。如果 您想要重用lambda,或者只是 想给它起个名字,你可以用 自动的


不起作用-lambda表达式不是函数指针。从概念上讲,它是一个匿名函子类。从我读到的内容来看,编译器应该能够理解它,如果不能,会告诉我。我来看看。谢谢。@Terry-hmm这很奇怪,因为这段代码现在正在GCC上编译和运行。“->运算符设置lambda的返回类型,如果没有返回类型,则可以忽略它”-当可以推断返回类型时,也可以忽略它;“在您的情况下,您需要将返回类型设置为shared_ptr”-他没有,因为他的lambda的主体是一个
return
语句,这正是可以推断返回类型的上下文。C++0x现在已经转换为用于非捕获lambda的函数指针,参见FCD中的§5.1.2/6。您是否知道std::function的标题?谷歌没有帮我…还有,你说的自动是什么意思?std::function在auto中是另一个c++0x特性,它在模板实例化的一些疯狂的boost错误上失败了。谢谢,我不知道其他人的情况,但我不得不从Boost中禁用一些C++0x功能(有启用/禁用它们的#定义)。
auto
在这里没有帮助,因为它不能用作像
vector
这样的容器的类型参数。没错,我只想提到开销。在英特尔编译器上,带函数的lambda仍然比缓存函数指针更快。从我的测试中大约快了3-5%。谢谢您的提示。@Pavel:您可以使用“自动”命名lambda,然后对该名称进行decltype以获取lambda对象的类型。后者可用作模板类型参数。@sellibitze:此时,您最好定义
T相同类型(T)
,然后将其编写为
decltype(相同类型([])
。可以说,尽管付出了种种努力,编写函子更容易:)
tuplearray[i] = FooTuple([](string bar, int rc, bool eom) -> {return shared_ptr<Foo>(new Foo(bar, rc, eom));});
#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);
}