C++ primer plus 第16章string 类和标准模板库, 函数对象

C++ primer plus 第16章string 类和标准模板库, 函数对象

C++ primer plus 第16章string 类和标准模板库, 函数对象


16.5 函数对象

很多STL 算法都使用函数对象–也叫函数符(fiunctor)。函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了()运算符的类对象(即定义了函数 operator()()的类)。例如,可以像这样定义一个类:

class Linear
{
private :
	double slope;
	double y0;
public :
	Linear(double sl=1,double y_=0)
		:slope(sl),yo(y1){}
	double operator()(double x)(return y0+slope *x}
};

这样,重载的()运算符将使得能够像函数那样使用Linear对象:

Linear f1;
Linear f2(2.510.0);//right-hand side is fl.operator()(12.5)
double y1 =f1(12.5);
double y2=f2(0.4);

其中y1将使用表达式0+112.5来计算,y2将使用表达式10.0+2.50.4来计算。在表达式 y0+slope*x中,y0 和 slope 的值来自对象的构造函数,而x的值来自 operator()( )的参数。还记得函数foreach吗?它将指定的函数用于区间中的每个成员:

for each(books.begin(),books.end(),ShowReview);

通常,第3个参数可以是常规函数,也可以是函数符。实际上,这提出了一个问题:如何声明第3个参数呢?不能把它声明为函数指针,因为函数指针指定了参数类型。由于容器可以包含任意类型,所以预先无法知道应使用哪种参数类型。STL通过使用模板解决了这个问题。forcach的原型看上去就像这样:

template<class InputIterator,class Function>Function for each(InputIterator first, InputIterator last, Function f);

ShowReview()的原型如下:

void ShowReview(const Review &);

这样,标识符 ShowReview的类型将为 void(*)(const Review &),这也是赋给模板参数 Function 的类型。对于不同的函数调用,Function 参数可以表示具有重载的()运算符的类类型。最终,forcach()代码将具有一个使用)的表达式。在 ShowReview()示例中,f是指向函数的指针,而代)调用该函数。如果最后的for each()参数是一个对象,则)将是调用其重载的()运算符的对象。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值