封装器WRAPPERS

封装器有很多种,它实质上是个模版。
书中提出了一个概念,叫callable类型,啥叫callable类型?说实话我也不知道,但是可以猜一猜。Callable英文的意思是随时可偿还的,随时可支付的。它的一个典型代表就是把函数的返回值赋给某个变量的情况。如下图所示:



Callable可以被称为可回收类型,那就这样吧。
书中举的例子是,一个模版接受了函数对象或者函数指针再或者lambda表达式作为参数,这个参数有些特殊,因为它看起来有点像函数,那就直接叫它函数吧,这个函数接收相同类型的参数并且返回相同类型的参数。模版每接受一次这样的函数参数就实例化一次,且各实例各不相同,但是这是没有必要的,因为函数参数的参数和返回值都是同样的类型,只用一个实例就够了,那么多实例实在是浪费,且低效。
像这样的函数参数就叫做callable参数,如下图红框所示:


封装器WRAPPERS_第1张图片


书中是用函数封装器解决这一问题的。
如上图所示,这是一个函数封装器,它生成了一个对象fdci,类型就是double(char,int)其中,char和int是参数类型,double是返回值类型。

然后每个函数封装器对象指向一个或者是函数或者函数对象或者lambda表


封装器WRAPPERS_第2张图片



封装器WRAPPERS_第3张图片

达式。这样的话像下图所示的模版实例就是同一个了。
但是,上述一个函数对应一个函数封装器对象的写法比较麻烦,于是产生了下面的写法。
1、函数封装器可以直接接收实参,这个参数就是函数、函数指针、函数对象或者LAMBDA表达式。
2、你也可以直接在函数模版的类型参数位置上放置模版函数封装器类型的参数。如下图所示:
由上图可见这俩类型是相同的。
另外,使用函数封装器必须要引入头文件functional。
封装器WRAPPERS_第4张图片

你可能感兴趣的:(封装器WRAPPERS)