草庐IT

lambda表达式

全部标签

c++ - 在通用 lambda 中使用模板参数

GCC允许以下语法作为扩展://afunctionalobjectthatwilladdtwolike-typeobjectsautoadd=[](Ta,Tb){returna+b;};在n3418,2012年通用lambda提案,我们看到允许上述内容的语法:overload([](T*p){...},但是,由于它是一个扩展,所以语法显然不存在(或不允许)。当我们使用auto时,上述语法在什么情况下有用,为什么不存在(或不允许)语法? 最佳答案 在我看来,C++14的多态lambda更简洁。您可以像下面这样重现示例情况的效果:str

c++ - 表达式 SFINAE 重载传递函数指针的类型

在这个例子中,一个函数被传递给一个隐式实例化的函数模板。//Functionthatwillbepassedasargumentintfoo(){return0;}//Functiontemplatetocallpassedfunctiontemplateintcall(Ff){returnf();}templateintcall(Ff,Aa){returnf(a);}inta=call(foo);我们可以通过为foo()添加重载来破解此代码.intfoo(inti){return0;}名称“foo”现在不明确,示例将不再编译。这可以通过显式提供函数指针类型信息来编译。int(*fun

c++ - 正则表达式算法 - 组合或

我正在开发一个C++应用程序来首先解析正则表达式字符串,然后用它执行一些计算。是否有任何现有的算法可以输出可以被给定正则表达式识别的长度为L的字符串的数量N,例如(a|ab)*|(aa|bb)*?或者是否有我可以使用的数学公式,例如涉及阶乘的数学公式?我只想获得可以由给定数字L的此类正则表达式短语识别的字符串数N。例如(a|ab)*正则表达式可以识别多少长度为5(L)的字符串。我认为答案是5。但是对于大量的L,我想知道是否有任何算法或数学表达式可以计算出来。 最佳答案 这是一种基于矩阵求幂的高效算法,您可以使用它来计算这些数字。我只

c++ - 具有与 std::function 不同签名的 Lambda 函数

我不明白为什么第三种情况没问题(即使lambda的参数类型不同于std::function类型)而编译器却提示第四种情况:functionidInt=[](inti){returni;};//OKfunctionidInt=[](int&i){returni;};//OKfunctionidInt=[](inti){returni;};//OKfunctionidInt=[](int&i){returni;};//ERROR! 最佳答案 当你写的时候:functionidInt=[](int&i){returni;};//ERROR

c++ - 如何在 C++ 模板中使用比较表达式?

#includetemplatestd::enable_if_tf(){}//OKtemplatestd::enable_if_t1,int>g(){}//VS2015:errorC2988:unrecognizabletemplatedeclaration/definitionintmain(){}我知道错误是由于编译器将“大于”符号“>”作为模板终止符号。我的问题是:在这种情况下,如何使比较表达式合法? 最佳答案 将表达式放在括号中:#includetemplatestd::enable_if_tf(){}templatestd

c++ - 如何从另一个 lambda 函数调用 lambda 函数

考虑下面设计的类,其方法A()包含两个lambda函数a1()和a2()。我希望能够从a1内部调用a2。但是,当我这样做时(a1中的第二行),我得到了错误错误:变量“无法隐式捕获,因为未指定默认捕获模式”我不明白这个错误信息。我应该在这里捕捉什么?我知道在lambda定义中使用[this]可以让我访问类foo中的方法,但我不清楚如何做我想做的事。预先感谢您让我明白这一点。classfoo{voidA(){autoa2=[this]()->int{return1;};autoa1=[this]()->int{intresult;result=a2();returnresult;};int

参数列表中带有省略号的 C++ Lambda

我正在开发一个使用lambda来描述表达式术语范围的库。因为库必须分发唯一的整数来标识每个变量,所以理想的情况是库而不是用户构造变量并且用户代码将它们作为lambda参数接收。(换句话说,我正在从miniKanren实现“call\fresh”的C++模拟。)由于用户可能想在特定范围内引入从零到许多新变量的任何数字,我希望用户能够将具有不同数量参数的lambda传递给库。但是,我不知道有任何(简单的)方法(在C++14中)可以推断出任意lambda对象的参数数量。我突然想到为什么不将固定数量(比如10个)的变量ID参数传递给lambda,并让用户代码在lambda中使用省略号来忽略不需

c++ - 抛出表达式中是否允许右值省略

在§[except.throw]中,标准规定抛出异常会从throw表达式复制初始化异常对象Throwinganexceptioncopy-initializes(11.6,15.8)atemporaryobject,calledtheexceptionobject为什么下面的代码可以在C++17上编译?classException{public:Exception()=default;Exception(Exception&&)=delete;Exception(constException&)=delete;};intmain(){throwException{};return0;}

c++ - 逗号运算符使 lambda 表达式成为非 constexpr

根据[thisQ&A]因为c++11逗号运算符支持constexpr。根据[thisQ&A]constexpr变量不应被lambda捕获,但应在其主体内可用。这两条规则使得以下代码可以在clang中编译://Example1templatestructFoo{};intmain(){constexprintc=1;static_cast(Foo{});}//Example2templatestructFoo{};intmain(){constexprintc=1;autolambda=[]{returnc*2;};static_cast(Foo{});}然而,虽然这两个示例都在clan

c++ - 链接到 gcc 中的 boost 正则表达式

我正在尝试编译我在Linux上使用正则表达式的程序。我在库/正则表达式/构建通过打字制作-fgcc.mak它创建了一个包含以下四个文件的目录gccboost_regex-gcc-1_35boost_regex-gcc-d-1_35libboost_regex-gcc-1_35.alibboost_regex-gcc-d-1_35.a现在我想在我的程序中使用正则表达式,该程序位于某个任意目录中。我#includedboost/regex.hpp我收到错误消息,指出未找到regex.hpp。然后我在g++编译器中给出了-I选项。我没有得到那个错误。但是我得到以下错误undefinedref