引子
下面代码中,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();
}