草庐IT

lambda_sync

全部标签

c++ - 如何在 lambda 函数中捕获可变数量的参数

我尝试了以下代码,但没有编译。templatevoidtpool::enqueue(T&&func,A&&...args){std::functiontask([func,args](){//...});} 最佳答案 只需使用省略号。根据C++11标准的第5.1.2/23段:Acapturefollowedbyanellipsisisapackexpansion(14.5.3).[Example:templatevoidf(Args...args){autolm=[&,args...]{returng(args...);};lm()

C++ lambda 。需要如何捕获指针?

比如有一个方法:voidfoo(A*p){autol=[=](){/*DoSomethingusingp*/};//Usel...}我应该如何捕获指针:通过引用还是通过值?内部lambdap没有改变,只是使用了它的方法。 最佳答案 它是一个指针这一事实不会影响您对ref或值捕获的决定。由于指针足够小,你不想写它,你可以按值捕获。我通常使用以下规则:如果它比指针大,使用引用,因为复制可能比取消引用更昂贵如果您想从lambda外部查看更改,显然引用是唯一的选择否则(如果它很小且不会改变)按值捕获所以一个不会改变的指针应该被值捕获。如果编

c++ - 在 lambda 表达式中捕获指针?

我有一个使用lambda表达式的函数。std::vectormBars;voidfoo(Bar*bar){autoduplicateBars=std::remove_if(mBars.begin(),mBars.end(),[bar](constBar*const&element){returnbar==element;});mBars.erase(duplicateBars,mBars.end());}后来,我查看了代码,意识到我可以在foo的签名中添加两个常量。voidfoo(constBar*constbar);bar的指针和数据现在是常量,但出于lambda表达式的目的,指针本

c++ - 传递给模板函数的两个 lambda 使参数的类型推导不明确——为什么?

如果我将一个lambda传递给它,我有一个模板可以工作,但是在一个将两个lambda映射到相同模板化类型的相关模板中,它无法推断出该类型,并且MSVC++Express2013提示模板参数不明确。首先要明确的是,这里没有进行重载(或特化)——我下面的两个示例是唯一具有这些标识符的实体。以下是模板,它们简单地将可调用对象应用于参数并返回结果:templateautoWhichOp1(Aargument,OPfirstOp)->decltype(firstOp(argument)){returnfirstOp(argument);}templateautoWhichOp2(Aargumen

c++ - 每个 lambda 函数都是匿名类吗?

autoa=[](){};autob=[](){};vectorv;v.push_back(a);//okv.push_back(b);//compilererrora和b有不同的类型。我想知道是否每个lambda函数实际上都是一种匿名类,每当我们创建一个lambda函数时,我们都会创建一个具有随机名称的新类,该名称仅对编译器可见? 最佳答案 是的,每个lambda都引入了自己独特的类型。现在同一个lambda可以通过几种方式关联多个闭包(lambda实例)。C++14返回类型推导是最简单的:autonothing(){return

c++ - 在函数模板中使用 lambda,无法推断类型,makeSet() 用例

我想要实现的是一个接受三个参数的makeSet()函数、一对迭代器和一个转换值的函数。一个用例可能是从一系列值创建一个集合并进行转换,例如,转换std::map至std::set>.客户端代码可能是这样的autos=makeSet(hash.begin(),hash.end(),[](std::pairx){returnstd::make_pair(x.second,x.first);});我目前的尝试如下,//(commentedcodearesomeother*failed*attempt).template::value_type,templateclassMonad,typen

c++ - 复制 std::vector 但将 lambda 应用于每个元素

我有一个std::vectorXofstd::vectorof,say,doubleinC++.我如何将X转换为std::vectorYofint使得X[i].size()==Y[i]对所有可接受的索引i成立?std::vector>X;.../*WhatIwanttodoshouldlookasfollows*/std::vectorY=std::copy_and_transform(X,lambda_to_get_size);当然,这可以通过循环来实现,但在C++11中我们更愿意使用lambda表达式。我在std::algorithm中没有找到类似的东西。标准工具似乎只提供更改原始

c++ - 无法在 lambda 中按值捕获随机分布和生成器?

下面的代码可以正常工作#include#includeintmain(){std::default_random_enginegenerator;std::normal_distributiondistribution(5.0,2.0);std::vectorv(100);std::generate(v.begin(),v.end(),[&](){returndistribution(generator);});return0;}但是,将lambda的捕获列表更改为[=]或[&,distribution]或[&,generator]会导致rand.cpp:9:59:error:noma

c++ - 如何在 lambda 中捕获此对象的变量?

我在SO上看到很多关于通过引用捕获this的答案,但我有一个不同的问题。如果我想捕获this对象拥有的特定变量怎么办?例如:autorel_pose=[this->_last_pose["main_pose"],&pose](Eigen::VectorXdpose1,Eigen::VectorXdpose2){//Somecodereturnpose;};我想按值捕获this的特定变量,并在我的lambda表达式中使用它。为什么这是不可能的? 最佳答案 可以申请by-copycapturewithaninitializer(C++1

c++ - 如何调用 lambda 模板?

我能够用gcc编译以下代码:templateautofunc(Pack...x){return(x+...);}templateautolamd=[](Pack...x){return(x+...);};我可以用func(1,2,3)调用函数模板,但在使用lamd(1,2,3)调用lambda时出现错误或lamd(1,2,3). 最佳答案 对于lambda,你可以做到genericlambda使用auto。autolamd=[](auto...x){return(x+...);};从C++20开始,您可以使用显式模板参数列表,但请注