【C++】lambda函数介绍和个人理解

一般数据类型的别名


众所周知,在C++中,有一种不同于地址引用的值引用类型,也就是这种定义。


int  a = 10;
cout << a << endl;//:10
int& d = a;//d为a的别名
cout << d << endl;//:10
a++;
cout << a << endl;//:11
d++;
cout << a << endl;//:12
cout << d << endl;//:12

这种写法就相当于给一个整型数据单元a赋予了一个别名(alias)。就和人的大名和小名一样,名字不同,但是人相同。

那么能不能给函数也加一个别名呢?

函数别名的实现方法

我们看到,别名这种东西并不难实现,只要知道了函数的类型,就可以类似的写出别名的定义方式。但是这里就不得不提到函数指针这一小插曲。因为不论如何,我们都要先写出函数的类型。

比方说,我希望把获取最大最小值的那个函数max的函数类型写出来。

int max(int a, int b)
{
return (a < b)? b: a;
}

不妨令这个函数的类型是dd2d(两个整型传入,一个整型传出),那么我们在写程序时需要这么做:

///函数max
int max(int a, int b){ return (a < b)? b: a; }
///typedef函数max的类型
typedef int (*dd2d)(int, int);
///写出max的别名函数
dd2d PickUpMaximum = max;

当然,一般的函数类型的模板类似于这个:

///函数fun声明或定义
return_type fun(var1_type, var2_type, var3_type, ...);
///typedef函数fun的类型
typedef return_type (*type_name)(var1_type, var2_type, var3_type, ...);
///新建变量并写出其别名
type_name fun_alias = fun;

如果你希望这个函数别名能够类似于数据一样可以通过一些操作什么的来改变函数内部的一些参数,嗯,这个功能目前实现不了,但是lambda函数实现了这一点。也就是通过初始化时的传入参数来调整函数内部的一些量。但是请注意,我们虽然成功的用一个别名调用了函数,但实质上我们只是调用了函数头指针,也就是通过这个地址来实现别名设置。所以不要想太多,这只是一个别名而已。

别名(alias)的优越性

其实我说的别名就是引用类型,只不过为了方便理解改称“别名”而已,而且加入了函数指针这一系统。

别名有什么好处呢?首先是具有一个很好的封装型。一般的别名都是一个“半const”类型。一旦一个变量名被声明为另一个变量名的别名,就不能够被声明称另一个变量的别名了。这就比方一对夫妇有两个小孩,老大叫“李华”,小的叫“李晓华”。如果老大的小名(也就是别名了)是“小华”,自然而然父母不会给小孩子再起这个“小华”的小名了。但为什么又是半const类型呢?因为这个别名所指向的内存和原变量名的地址一样,如果原变量是一个非const变量,自然这个别名也就可以修改自身的值。这个优点在封装,还有接口准备中作用非常好。不妨说我这里需要完成一个数据交换的过程(a与b交换),如果我们用别名来写函数接口,就会在使用过程中非常简单,省去很多麻烦。


///指针作为形参
void swap_pnt(int* a, int* b)
{
int t;
t = *a; *a = *b; *b = t;
}
///usage:
/// swap_pnt(&a, &b);

///别名作为形参
void swap_ref(int& a, int& b)
{
int t;
t = a; a = b; b = t;
}
///usage:
/// swap_ref(a, b);

其次,就是容错性。一般在大型工程中,为了防止函数重名,我们有时会利用命名空间的封装优势,或者就干脆直接把名字起的非常的冗长,以防止重名或者相似的名字。但是这样做也为我们的后续工作带来了很大的工作负担。简单的说,如果你在一个方法中,需要不停地调用一两个底层方法,那么就会出现一些非常非常非常冗长的代码,而且这些字符基本上是没有意义的,在项目的交流中虽然能够“见其名知其意”,但是总归是不满意。因而,可以利用这个函数别名来精简代码,保证可读性。简单的举个例子:


namespace Basic_Method
{
//...
struct TextBox{};
//...
string getStringFromTextBox(TextBox& );
string getCountNumberFromTextBox(TextBox& );
double getAverage(int[] , int );
//...
}

namespace Interface_of_Rate
{
//...
typedef Basic_Method::TextBox TextBox;
void newInterface(TextBox& , time_t );
void flash(TextBox& , time_t );
void getUpdate(TextBox& , time_t );
//...
}

void Interface_of_Rate::getUpdate(TextBox id, time_t ti)
{
///typedef function
typedef string (*getStr)(TextBox);
getStr getnote = Basic_Method::getStringFromTextBox;
getStr getcnts = Basic_Method::getCountNumberFromTextBox;
///直接使用
string note = getnote(id);
string cnts = getcnts(id);

//...
}

当然其实也可以用局部的#define来完成类似的过程,但是一般来说是不推荐的,毕竟#define是一个很危险的使用方法,很危险。

关于别名就这么多吧,大概用处也就那点,不难学。

时间: 2024-10-07 14:46:54

【C++】lambda函数介绍和个人理解的相关文章

【C++】【lambda】lambda函数介绍和个人理解(3)——lambda的语法甜点

导航: lambda函数介绍和个人理解(1)--初识lambda lambda函数介绍和个人理解(2)--lambda与仿函数 lambda函数介绍和个人理解(3)--lambda的语法甜点 其实,与其说这是一篇介绍lambda语法甜点的文章,不如说是一篇教大家使用lambda函数的一篇文章.当然不可避免的会用到一些有趣的实验.文章略长,大家耐心耐心看吧!当然,这也是本人写的关于lambda函数的最后一篇博文了,如果大家有其他更好的想法或者更深入的理解,请联系我~ 本文大概讲这些内容:基础使用,

【C++】【lambda】lambda函数介绍和个人理解(1)——初识lambda

导航: lambda函数介绍和个人理解(1)--初识lambda lambda函数介绍和个人理解(2)--lambda与仿函数 lambda函数介绍和个人理解(3)--lambda的语法甜点 什么是lambda函数? 其实,lambda函数我个人更愿意称为lambda运算(lambdacalculus),它是用来表示一种匿名函数.这个严格意义上属于"函数式编程"(Functional Programming)的范畴.当然还是先解释下函数式编程的概念的好.按照当时冯·诺依曼机器的基本计算

【C++】【lambda】lambda函数介绍和个人理解(2)——lambda与仿函数

前言: 本来是打算11月末的时候写这篇文章,结果一直拖拖拖拖拖啊啊啊啊啊事多啊事多!OK这是对lambda的分析的第二篇,第三篇准备给大家带来一些"语法甜点",不过实在是不知道什么时候能够写完=.=到时候再说 导航: lambda函数介绍和个人理解(1)--初识lambda lambda函数介绍和个人理解(2)--lambda与仿函数 lambda函数介绍和个人理解(3)--lambda的语法甜点 正文: 好点的编程语言一般都有好的库支持,C++也不例外.C++语言在标准程序库STL中

深入理解Lambda函数及其用法

Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 先来看个简单lambda函数 >>> lambda x, y : x+y <function <lambda> at 0x102bc1c80> x和y是函数的两个参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求两个变量的和,但作为一个函数,没有名字如何使用呢?这里我们暂且给这

Python编程中自定义Lambda函数的使用场景

Python 中定义函数有两种方法,一种是用常规方式 def 定义,函数要指定名字,第二种是用 lambda 定义,不需要指定名字,称为 Lambda 函数. Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个

C++11新特性:Lambda函数(匿名函数)

声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译 C++11终于知道要在语言中加入匿名函数了.匿名函数在很多时候可以为编码提供便利,这在下文会提到.很多语言中的匿名函数,如C++,都是用Lambda表达式实现的.Lambda表达式又称为lambda函数.我在下文中称之为Lambda函数. 为了明白Lambda函数的用处,请务必先搞明白C++中的自动

Python的lambda函数与排序

Python的lambda函数与排序 2010-03-02 15:02 2809人阅读 评论(0) 收藏 举报 lambdapythonlistlispclass工作 目录(?)[+] 前几天看到了一行求1000的阶乘的Python代码: print    reduce ( lambda    x , y : x * y ,    range ( 1 ,    1001 )) 一下子被python代码的精简 与紧凑所折服,故对代码进行了简单的分析. reduce与range都是Python的内置

python lambda 函数 学习

lambda 函数,跟普通函数类似,使用方法是一样的,可以用于定义简单的函数. 介绍: >>> def f(x): ... return x*2 ... >>> f(3) 6 >>> g = lambda x: x*2 >>> g(3) 6 >>> (lambda x: x*2)(3) 6 再看一个稍微复杂点例子: processFunc = collapse and (lambda s: " "

Linux驱动 - select函数介绍

一.select 函数介绍 select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include <sys/time.h> #include <unistd.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描述符值+1:rdset,