草庐IT

generic-lambda

全部标签

c++ - 从 lambda 访问 for_each 迭代器

是否可以访问std::for_each迭代器,这样我就可以使用lambda从std::list中删除当前元素(如下所示)typedefstd::shared_ptrEventPtr;std::listEventQueue;EventTypeevt;...std::for_each(EventQueue.begin(),EventQueue.end(),[&](EventPtrpEvent){if(pEvent->EventType()==evt.EventType())EventQueue.erase(???Iterator???);});我读过关于使用[](typenameT::va

c++ - 从 boost::phoenix::lambda 中调用一个函数

我正在尝试使用boost::phoenix在缺少C++11支持的旧编译器上模拟C++lambda表达式,但我无法从lambda表达式中调用简单函数.C++11版本:[](unsigneda){foo(a);}(12678u);//callsfoo(12678u)我的PhoenixLambda代码如下:#include#include#includenamespaceph=boost::phoenix;usingph::local_names::_a;usingph::placeholders::arg1;voidfoo(uint32_tval){std::cout这会产生以下编译器错误

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