草庐IT

lambda表达式

全部标签

c++ - 使用 Lambda 和递归函数调用了解 QTimer

我有以下代码:voidclass::Testfunc(){QTimer*timer=newQTimer;QObject::connect(timer,&QTimer::timeout,[this](){emitLog("Timeout...");TestFunc(serverAddress,requestsFolderPath);//deleteLater();//***whydoesthiscrashifusedtoreplacetheconnectbelow?});connect(timer,&QTimer::timeout,timer,&QTimer::deleteLater);

c++ - lambdas 中的模板参数列表中的 auto 是标准的一部分吗?

今天,我偶然发现了以下代码片段:#includeintmain(){autoa=[](std::pairvalue){};a(std::pair{3,true});}http://cpp.sh/5p34我只有一个问题:标准支持这段代码吗?它在GCC中编译(使用-std=c++14),但不是clang或VisualStudio2015(VC++14)。这似乎应该成为标准的一部分,因为如果lambda应该具有与常规函数相同的模板支持,那么应该支持它。这似乎可以转换为所有模板类型,而不仅仅是std::pair。 最佳答案 在C++14中,

c++ - 显然相同的数学表达式具有不同的输出

以下代码将在x8632位机器上为变量“e”和“f”输出不同的结果,但在x8664位机器上输出相同的结果。为什么?理论上相同的表达式正在被评估,但技术上它不是。#includemain(){doublea,b,c,d,e,f;a=-8988465674311578540726.0;b=+8988465674311578540726.0;c=1925283223.0;d=4294967296.0;e=(c/d)*(b-a)+a;printf("%.80f\n",e);f=c/d;f*=(b-a);f+=a;printf("%.80f\n",f);}注意...可以使用“gcc-m32”生成3

c++ - 这个带有空捕获列表的 lambda 如何能够引用到达范围名称?

在C++14标准§5.1.2/12中,它显示了一个lambda表达式的示例,该表达式显然似乎能够引用到达范围的变量x,即使:捕获列表为空,即没有捕获默认值评论说它“不捕获x”例子如下:voidf(int,constint(&)[2]={}){}//#1voidtest(){constintx=17;autog=[](autoa){f(x);//OK:calls#1,doesnotcapturex};}看到它doescompile.它似乎取决于x是const;如果const被移除,它就不会再像预期的那样编译(捕获列表是空的)。即使我将参数设为int以使其不再是通用lambda,也会发生这

c++ - gcc "overflow in expression"而等效等效表达式工作正常

这是我的代码#includestaticconstunsignedlonglongintxx=(36*36*36*36)*(36*36*36*36);staticconstunsignedlonglonginty=36*36*36*36;staticconstunsignedlonglongintyy=y*y;intmain(){std::cout这是编译输出#g++-std=c++11test.cpp-otesttest.cpp:2:62:warning:integeroverflowinexpression[-Woverflow]staticconstunsignedlonglon

c++ - 如何在lambda中捕获变量

我有来自here的代码:std::sort(begin(v),end(v),[](autoconst&t1,autoconst&t2){returnget(t1)(t2);//oruseacustomcomparefunction});我想对元组进行多次排序,所以我写了这段代码:intk=10;while(k--){std::sort(begin(v),end(v),[](autoconst&t1,autoconst&t2){returnget(t1)(t2);//oruseacustomcomparefunction});}但我收到错误error:‘k’isnotcaptured。我

c++ - 当索引不是整数常量表达式时,不要使用数组下标;使用 gsl::at() 代替

我试图在MicrosoftVisualStudio中创建一些示例代码,看起来像这样intmain(){constsize_tsize=10;intarr[size];for(size_ti=0;i现在JetBrainsResharperC++在arr[i]=i;行发出以下警告Donotusearraysubscriptwhentheindexisnotanintegerconstantexpression;usegsl::at()instead我不明白这意味着什么以及如何解决这个警告。因为这是我经常使用的方案,所以我有点担心警告。谁能给我建议或指出正确的方向?编辑:将循环更改为:for

c++ - 可变参数模板 : Perfect forwarding of integer parameter to lambda

有类似的问题,但我没有找到适合我的问题的答案。考虑以下代码:#include#include#include#include#includeclassTestClass{public:TestClass(intvalue):mValue(value){}private:intmValue;};templateclassDeferredCreator{public:templateDeferredCreator(Args&&...args):mpCreator([=]()->T*{returnnewT(std::forward(args)...);}),mpObject(){}T*get

hiveSql解析DolphinScheduler调度系统7位crontab表达式

背景先说下我们数仓大致的数据链路。各个业务系统的数据库->hive->doris->报表/邮件/系统hive里ods层几乎所有的数据都依赖于从业务库拉取,但是偶尔也难以避免的会遇到拉取失败或者集群(主要是业务库)宕机的情况,导致ods层数据大批量的拉取失败,从而影响到dwd层、dws层、ads层等数以千计的hive表,进而影响到数据。每当遇到宕机的情况我们的解决方案是——重新拉取数据后把失败的工作流从后往前一个个重跑,一上午甚至大半天的时间就这么过去了,手累,心也累。最主要的问题在于,各个DS工作流之前的顺序是不能搞错的,否则还需要重跑。所以单纯按照工作流失败的顺序来执行,不仅麻烦且容易出错。

c++ - 科学计数法数字的正则表达式?

我正在加载一个.obj文件,其中包含如下行vn8.67548e-0171-1.55211e-016用于顶点法线。我怎样才能检测到它们并将它们带入双重表示法? 最佳答案 一个运行良好的正则表达式是:-?[\d.]+(?:e-?\d+)?可以这样转换为数字:StringinscientificnotationC++todoubleconversion,我想。正则表达式是-?#anoptional-[\d.]+#aseriesofdigitsordots(see*1)(?:#startnoncapturinggroupe#"e"-?#an