C++ —— lambda表达式

引子

下面代码中,main函数中的四句代码

printInfo(1,2,3);
printUseClass(1,2,3);
templatePrint(1,2,3);
printUseTempClass(1,2,3);

在用户眼里都是函数调用,但是具体实现存在差异:

#include <functional>
#include <iostream>

void printInfo(int a, int b, int c) {
	std::cout << "a " << a << "b " << b << "c " << c <<std::endl;
}

struct Print {
	void operator()(int a, int b, int c) const {
		std::cout << "a " << a << "b " << b << "c " << c << std::endl;
	}
};

template<typename T1, typename T2, typename T3>
void templatePrint(T1 a, T2 b, T3 c) {
	std::cout << "a " << a << "b " << b << "c " << c << std::endl;
}

struct TemplatePrint {
	template<typename T1, typename T2, typename T3>
		void operator()(T1 a, T2 b, T3 c) const {
			std::cout << "a " << a << "b " << b << "c " << c << std::endl;
		}
};

int main() {
	Print printUseClass;
	TemplatePrint printUseTempClass;


	printInfo(1,2,3);
	printUseClass(1,2,3);
	templatePrint(1,2,3);
	printUseTempClass(1,2,3);
}

如此,会造成代码的可用性差。研究语句的相关实现时需要去查找实现代码;且当函数功能简单时,这几种方式又会显得过于冗余。因此,引入lambda表达式。

lambda表达式的本质是允许inline函数的定义作为一个参数或者作为一个local对象

作为一个local对象的例子:

auto local=[](int a, int b, int c){
     std::cout << "a " << a << "b " << b << "c " << c << std::endl;
};

 形式十分类似于定义出来的内联函数:

inline void print(int a, int b, int c) {
   std::cout << "a " << a << "b " << b << "c " << c << std::endl;
}

因此,lambda本质上是一个inline函数,因为添加了一些C++语法槽,
我们可以将inline函数保存为本地化对象 或者是将inline函数作为一个参数来进行传递

作为一个参数的例子:

#include <functional>
#include <iostream>

template<typename Func>
void printUseFunc(Func func, int a, int b, int c) {
	func(a,b,c);
}

int main() {	
	int a = 1;
	int b = 2;
	int c = 3;

	printUseFunc([](int a, int b, int c){
		std::cout << "a " << a << "b " << b << "c " << c << std::endl;
	},1,2,3);
}

整体实现代码:

#include <functional>
#include <iostream>

inline void print(int a, int b, int c) {
  std::cout << "a " << a << "b " << b << "c " << c << std::endl;
}

template<typename Func>
void printUseFunc(Func func, int a, int b, int c) {
	func(a,b,c);
}

int main() {
	
	int a = 1;
	int b = 2;
	int c = 3;

	//表达式的本质是允许inline函数的定义作为一个参数或者作为一个local对象
	// lambda c++
	/*
	作为一个local对象的例子:
	auto local=[](int a, int b, int c){
		std::cout << "a " << a << "b " << b << "c " << c << std::endl;
	};

	形式十分类似于定义出来的内联函数:
	inline void print(int a, int b, int c) {
		std::cout << "a " << a << "b " << b << "c " << c << std::endl;
	}

	因此,lambda本质上是一个inline函数,因为添加了一些C++语法槽,
	我们可以将inline函数保存为本地化对象 或者是将inline函数作为一个参数来进行传递

	作为一个参数的例子:
	printUseFunc([](int a, int b, int c){
		std::cout << "a " << a << "b " << b << "c " << c << std::endl;
	},1,2,3);
	*/
	auto local = [&] //[=]代表拷贝local变量,[&]代表将变量的引用传入
		() {
			std::cout << "a " << a << "b " << b << "c " << c << std::endl;
		};
	local();
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值