C++ Boost Lambda表达式详解

   2023-02-09 学习力0
核心提示:目录lambda表达式格式说明Boost.Lambdalambda表达式格式lambda表达式的格式[捕捉列表](参数列表)mutable-返回值类型{ 语句部分 };其中参数列表、返回值类型是可选的,捕捉列表、函数体可以为空。先来看一个较为简单的lamda表达式int main(void){auto add = []

lambda表达式格式

lambda表达式的格式

[捕捉列表](参数列表)mutable->返回值类型{ 语句部分 };

其中参数列表、返回值类型是可选的,捕捉列表、函数体可以为空。

先来看一个较为简单的lamda表达式

int main(void)
{
	auto add = [](int a, int b)->int {return a + b; };
	cout << add(1, 2) << endl;
	return 0;
}

mutable可以省略,暂时不考虑。

  • 捕捉列表,捕捉列表的[]是千万不能省略的,编译器会根据[]判断该表达式是否为lambda表达式,捕捉列表能够捕捉上下文的变量提供给lambda表达式使用。
  • 参数列表,就和普通的函数传参是一样的,如果不需要参数,那么可以连同()一起省略
  • mutable:默认情况下,lambda表达式参数列表和捕捉列表被修饰成const属性,而mutable的作用就是取消它的const属性。如果使用了mutable参数一定不能省略,如果参数为空,那么需要保留()
  • ->返回值类型。返回值类型明确或没有返回值的情况下,该部分可省略,编译器会对返回值类型进行推导。
  • 语句部分。和不同函数的函数体内语句部分是一样的含义,函数体内不仅可以使用它的参数,还可以使用所有捕获到的变量。

所以最简单的lambda表达式应该是[]{}

lambda表达式又被称为匿名函数,无法被直接调用,它的底层其实也是仿函数类。需要借助auto将表达式赋值给一个变量。

说明Boost.Lambda

在 C++11 之前,您需要使用像 Boost.Lambda 这样的库来利用 lambda 函数。从 C++11 开始,这个库可以被视为已弃用,因为 lambda 函数现在是编程语言的一部分。如果您在不支持 C++11 的开发环境中工作,您应该在转向 Boost.Lambda 之前考虑 Boost.Phoenix。 Boost.Phoenix 是一个较新的库,如果您需要在没有 C++11 的情况下使用 lambda 函数,它可能是更好的选择。

lambda 函数的目的是使代码更紧凑且更易于理解(请参见示例 43.1)。

示例 43.1。带有 lambda 函数的 std::for_each()的

#include <boost/lambda/lambda.hpp>#include <vector>#include <algorithm>#include <iostream>int main(){  std::vector<int> v{1, 3, 2};  std::for_each(v.begin(), v.end(),    std::cout << boost::lambda::_1 << "\n");}

C++ Boost Lambda表达式详解

Boost.Lambda 提供了几个助手来创建无名函数。代码写在应该执行的地方,不需要包装在函数中,也不必显式调用函数。在示例 43.1 中,std::cout << boost::lambda::_1 << "\n" 是一个 lambda 函数,它需要一个参数,它在写入标准输出后跟一个新行。

boost::lambda::_1 是一个占位符,它创建一个需要一个参数的 lambda 函数。占位符中的数字决定了预期参数的数量,因此 boost::lambda::_2 预期两个参数,而 boost::lambda::_3 预期三个参数。 Boost.Lambda 只提供了这三个占位符。示例 43.1 中的 lambda 函数使用 boost::lambda::_1,因为 std::for_each() 需要一个一元函数。

包括 boost/lambda/lambda.hpp 以使用占位符。

请注意,\n 而不是 std::endl,在示例 43.1 中用于输出新行。如果您使用 std::endl,该示例将无法编译,因为 lambda 函数 std::cout << boost::lambda::_1 的类型与一元函数模板 std::endl() 预期的类型不同。因此,您不能使用 std::endl。

示例 43.2。带有 boost::lambda::if_then() 的 lambda 函数

#include <boost/lambda/lambda.hpp>#include <boost/lambda/if.hpp>#include <vector>#include <algorithm>#include <iostream>int main(){  std::vector<int> v{1, 3, 2};  std::for_each(v.begin(), v.end(),    boost::lambda::if_then(boost::lambda::_1 > 1,    std::cout << boost::lambda::_1 << "\n"));}

C++ Boost Lambda表达式详解

头文件 boost/lambda/if.hpp 定义了可用于在 lambda 函数中创建 if 控制结构的结构。最简单的构造是函数模板 boost::lambda::if_then(),它需要两个参数:第一个参数是一个条件。如果条件为真,则执行第二个参数。两个参数都可以是 lambda 函数,如示例 43.2 所示。

除了 boost::lambda::if_then() 之外,Boost.Lambda 还提供函数模板 boost::lambda::if_then_else() 和 boost::lambda::if_then_else_return(),它们都需要三个参数。还为循环和转换运算符提供函数模板,并在 lambda 函数中抛出异常。 Boost.Lambda 定义的许多函数模板使得定义 lambda 函数成为可能,这些函数丝毫不逊色于普通的 C++ 函数。

原文地址:https://yamagota.blog.csdn.net/article/details/127832708
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Aurelius vs mORMot vs EntityDAC Delphi 的
    Aurelius vs mORMot vs EntityDAC   Delphi 的 ORM框架:http://www.tmssoftware.com/site/aurelius.asp#product-buy-onlinehttps://synopse.info/fossil/wiki/Synopse+OpenSourcehttps://www.devart.com/entitydac/download.htmlkbmMW  http://www.compo
    02-09
  • 【Ruby】Mac gem的一些坑
    前言自上一次升级MacOS系统后出现jekyll无法构建的问题,当时处理半天。谁知道最近又升级了MacOS,荒废博客多时,今天吝啬写了一篇准备发布,构建报错,问题重新。还是记录下,以防下次升级出问题。问题描述安装jekyll静态博客需要在Ruby环境下运行,于是参照
    02-09
  • iOS oc 调用 swift
    如股票oc要调用swift里面的代码 需要包含固定这个头文件项目名称 LiqunSwiftDemo-Swift.h         #ProjectName#-Swift.h固定的写法swift 目的 是取代oc 但是 不会完全取代 只是前端的替换LiqunSwiftDemo-Swift 点进去 可以看到 所有的swift代码 都产生
    02-09
  • objective-c NSTimer 定时器
    -(void)initTimer{//时间间隔NSTimeInterval timeInterval =3.0 ;//定时器repeats 表示是否需要重复,NO为只重复一次NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:timeInterval target:self selector:@selector(mobileAnimation) userInfo:nil
    02-09
  • Objective-C  日记③ 字符串
    Objective-C 日记③ 字符串
    一、创建字符串、类方法   公式创建NSString  +(id) stringWithFormat:(NSString *) format,……;eg:  NSString *height;  height=[NSString stringWithFormat:@"高度是: %d 长度: %d",10,20];得到的字符串:“高度是: 10 长度: 20” 注意:  省
    02-09
  • Objective-C KVC机制
    Objective-C KVC机制http://blog.csdn.net/omegayy/article/details/7381301全部推翻重写一个版本,这是我在公司内做技术分享的文档总结,对结构、条理做了更清晰的调整。 1.    基本概念MODEL主要是英文文档里面经常出现的一些概念,讲解一下,方便英文
    02-09
  • objective-c 加号 减号 - +
    “加号代表static”是错误的说法,可能跟你那样表达的人其实意思是:“前置加号的方法相当于Java 里面的静态方法”。在Oc中,方法分为类方法和实例方法。前置加号(+)的方法为类方法,这类方法是可以直接用类名来调用的,它的作用主要是创建一个实例。有人把
    02-09
  • Objective-C  日记①
    Objective-C 日记①
    1、Xcode的.m扩展名表示文件含有Object-C代码,C以.c文件,C++以.cpp文件2、头文件声明:C使用:#include,O-C使用#import(当然你也可以使用#include) 3、输出方式:  C:printf("",参数);  O-C:NSLog(@"",参数); 4、布尔类型  C:bool 具有true
    02-09
  • ASP.NET MVC 操作AD 获取域服务器当前用户姓
    #region 根据当前登录域账号 获取AD用户姓名和所在OU目录/// summary/// 根据当前登录域账号 获取AD用户姓名和所在OU目录/// /summary/// param name="searchUser"要搜索的当前用户名/param/// param name="paths"out返回该用户所在OU目录/param/// param nam
    02-09
  • swift和OC - 拆分数组 和 拆分字符串
    1. 拆分数组 /// 根据 数组 截取 指定个数返回 多个数组的集合func splitArray( array: [Date], withSubSize subSize: Int) - [[Date]] {//数组将被拆分成指定长度数组的个数let count = array.count% subSize == 0 ? (array.count/ subSize) : (array.count
    02-08
点击排行