C++ Boost Lambda表达式详解

目录
  • lambda表达式格式
  • 说明Boost.Lambda

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");}

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"));}

头文件 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++ 函数。

到此这篇关于C++ Boost Lambda表达式详解的文章就介绍到这了,更多相关C++ Boost Lambda内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-11-18

C++11&nbsp;lambda表达式在回调函数中的使用方式

目录 一.lambda表达式在C++异步框架中的应用 二.如何在C-style注册回调函数中使用lambda表达式? 在回调函数中使用lambda表达式的好处,在于可以利用C++的RAII机制来做资源的自动申请释放,避免手动管理出错. 一.lambda表达式在C++异步框架中的应用 1. 一个boost asio的例子 // // async_tcp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-202

C++lambda表达式使用介绍

目录 前言 lambda表达式格式 一些语法 走进底层 前言 C++98中的一个例子. #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; struct Goods { string _name; float _price; int _evaluate; Goods(const char* str, double p

C++学习之Lambda表达式的用法详解

目录 简介 捕获 原理 Lambda回调 简介 Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.Lambda表达式可以表示闭包(注意和数学传统意义上的不同). 闭包就是能够读取其他函数内部变量的函数,可以理解成“定义在一个函数内部的函数“.在本质上,闭包是将函数内部和函数外部连接起来的桥梁. C++中的Lambda表达式

深入解析C++11 lambda表达式/包装器/线程库

目录 零.前言 一.lambda表达式 1.lambda的引入 2.lambda表达式语法 3.捕获列表说明 4.函数对象与lambda表达式 二.包装器 1.function包装器 2.bind 概念: 三.线程库 1.线程的概念及使用 2.线程函数参数 3.原子性操作库(atomic) 4.lock_guard与unique_lock 1.mutex的种类 2.lock_guard 3.unique_lock 5.两个线程交替打印奇数偶数 零.前言 本章是讲解学习C++11语法新特性的第三篇

C++11 lambda(匿名函数)表达式详细介绍

目录 前言 概念及基本用法 捕获变量 lambda表达式类型 声明式的编程风格 总结 前言 Lambda(匿名函数)表达式是C++11最重要的特性之一,lambda来源于函数式编程的概念,也是现代编程语言的一个特点. 优点如下: 声明式编程风格:就地匿名定义目标函数或函数对象,有更好的可读性和可维护性. 简洁:不需要额外写一个命名函数或函数对象,,避免了代码膨胀和功能分散. 更加灵活:在需要的时间和地点实现功能闭包. 概念及基本用法 lambda表达式定义了一个匿名函数,并且可以捕获一定范围内的

C++详细分析lambda表达式的本质

例: stable_sort(words.begin(), words.end(), [](const string& s1, const string& s2) { return s1.size() < s2.size(); }); class ShorterString { public: bool operator()(const string& s1,const string& s2)const { return s1.size() < s2.size(

C++精要分析lambda表达式的使用

目录 引言 语法与示例 捕获列表 捕获引用 特殊用法 实现原理 应用 引言 C++要走向现代语言,如果不支持lambda表达式,你很难认为这门语言和现代有什么关系.幸好,从C++11标准起,它就实现了对lambda表达式的支持. 那么,什么是lambda表达式呢? lambda表达式是匿名函数,就是说不用定义函数名,函数实现可以直接嵌入在业务逻辑代码中.诸如python.java.C#等语言,都将其作为基础特性. 其优点是提高了代码的可读性,对于一些无需重用的方法特别适合.例如在容器的迭代中实现

Java详细分析Lambda表达式与Stream流的使用方法

目录 Lambda Stream流 Lambda Lambda 表达式是一个匿名函数,我们可以把 lambda 表达式理解为一段可以传递的代码(将代码段像数据一样传递).使用它可以写出更简洁, 更灵活的代码.作为一种更紧凑的代码风格,使 java 语言的表达式能力得到的提升. 我们可以知道, Lambda表达式是为简化语法而存在的 ArrayList<String> list = new ArrayList<>(); list.add("a"); list.ad

详细分析Java Lambda表达式

在了解Lambda表达式之前我们先来区分一下面向对象的思想和函数式编程思想的区别 面向对象的思想: 做一件事情,找一个能解决这个事情的对象,调用他的方法来解决 函数时编程思想: 只要能获取到结果,谁去做的都不重要,重视的是结果,不重视过程 使用Lambda表达式的目的是为了简化我们的代码 匿名内部类虽然也简化了我们的代码,但是Lambda比他更简单,而且语法也更加少 下面我用一段代码来演示一下二者的区别 public class Main { public static void main(St

详解lambda表达式foreach性能分析

java 8的新特性之一就是lambda表达式,parallelStream()都说性能会比较高,现一探究竟. 话不多说,上代码: @Test public void test2(){ List<String> list = new ArrayList<>(); for(int i=0;i<10000;i++) list.add(String.valueOf(i)); //lambda表达式 long start = System.currentTimeMillis(); /

python lambda 表达式形式分析

目录 lambda表达式格式 匿名的用法 前言: 在日常开发的过程中,有时候会临时用到一些简单的函数,她们的业务逻辑会相对简单,简单到并不值得让他们留下名字,这个时候,就很值得使用匿名函数 lambda函数来完成这个需求. lambda表达式格式 lambda arguments : statement 表达式以​​ lambda​​关键字开头,冒号 ":" 左侧是函数的传入参数,当有多个入参时使用逗号划分开,冒号右侧是返回值的表达式语句,函数会根据表达式计算结果并将其返回.​​lam

Java Lambda表达式与匿名内部类的联系和区别实例分析

本文实例讲述了Java Lambda表达式与匿名内部类的联系和区别.分享给大家供大家参考,具体如下: 一 点睛 Lambda表达式与匿名内部类存在如下相同点: Lambda表达式与匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部类的成员变量(包括实例变量和类变量). Lambda表达式创建的对象与匿名内部类生成的对象一样, 都可以直接调用从接口继承得到的默认方法. Lambda表达式与匿名内部类主要存在如下区别: 匿名内部类可以为任意接口创建实例

Java Lambda表达式的方法引用和构造器引用实例分析

本文实例讲述了Java Lambda表达式的方法引用和构造器引用.分享给大家供大家参考,具体如下: 一 点睛 如果Lambda表达式的代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用,以使得Lambda表达式更加简洁. 种类 示例 说明 对应的Lambda表达式 引用类方法 类名::类方法 函数式接口中被实现方法的全部参数传给该类方法作为参数. (a,b,...) -> 类名.类方法(a,b, ...) 引用特定对象的实例方法 特定对象::实例方法 函数式接口中被实现方法的全部参数传

Python lambda表达式用法实例分析

本文实例讲述了Python lambda表达式用法.分享给大家供大家参考,具体如下: lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. lambda所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新定义一个函数了,使用lambda就有点过于执拗了. lambda就是用来定义一个匿名函数的,如果还要给他绑定一个名字的话,就会显得有点画蛇添足,通常是直接使用lambda函数.如下所示: add = lambda x, y : x+y

Java Lambda表达式和函数式接口实例分析

本文实例讲述了Java Lambda表达式和函数式接口.分享给大家供大家参考,具体如下: 一 点睛 Lambda表达式的类型,也称为"目标类型",Lambda表达式的目标类型必须是函数式接口.函数式接口代表只包含一个抽象方法的接口.函数式接口可以包含多个默认方法.类方法,但只能声明一个抽象方法. 如果采用匿名内部类语法来创建函数式接口的实例,只要实现一个抽象方法即可,在这种情况下即可采用Lambda表达式来创建对象,该表达式创建出来的对象的目标类型就是这个函数式接口. Java 8专门