STL(标准模板库)中class并不一定是“类”

模板中的Class与Function
本文探讨了C++模板中class关键字的应用,不仅限于类,还可以用于函数。通过具体示例,展示了如何将函数作为模板参数传递,并在STL中的find_if函数中应用这种技术。

在模板库里面,可谓“处处皆模板”,当然了不是模板就不叫模板库了,但是有一点经常让人忽视,使用模板时候,类就真的时候类?也就是说class就真的是类?答案是否定的!

我们看一段代码:

#include<stdio.h>

typedefintD(intx);

template
<classT,classR>
Rgetmy(Rx,T
*f);

template
<classT,classR>
Rgetmy1(Rx,Tf);

Dmy;

intmain(){
printf(
"x=%d",getmy(10,my));
printf(
"x=%d",getmy1(10,my));
return1;
}

template
<classT,classR>
Rgetmy(Rx,T
*f){
(
*f)(x);
returnf(x);
}

template
<classT,classR>
Rgetmy1(Rx,Tf){
returnf(x);
}

intmy(intx){
returnx;
}

从上面的getmy函数和getmy1函数就可以看出,里面的class T就不是“类”,仅仅是一个函数,当然了更多情况下我们使用类,这也是很多觉得不要用class标记,而是使用typename标记。

当传入my函数的时候,T类型就自然解释成了D!函数的按地址调用这里就不说了。

回到STL,我们再看标准模板库里面的一个函数:find_if(....)

template<class_InIt,
class_Pr>inline
_InIt_Find_if(_InIt_First,_InIt_Last,_Pr_Pred)
{
//findfirstsatisfying_Pred
_DEBUG_RANGE(_First,_Last);
_DEBUG_POINTER(_Pred);
for(;_First!=_Last;++_First)
if(_Pred(*_First))
break;
return(_First);
}

template
<class_InIt,
class_Pr>inline
_InItfind_if(_InIt_First,_InIt_Last,_Pr_Pred)
{
//findfirstsatisfying_Pred
_ASSIGN_FROM_BASE(_First,
_Find_if(_CHECKED_BASE(_First),_CHECKED_BASE(_Last),_Pred));
return(_First);
}

在find_if的定义里面,第三个参数,被假定为谓词,返回一个bool类型,这里定义是

class _Pr 类型的_Pred变量。

事实上,在stl的设计时候,一般的假定这个变量是一个类对象,可以作为函数对象,或者说拟函数对象,候捷同志(“台湾人我们就称呼为同志吧”)在stl源码剖析一书里面说这个也叫仿函数。

事实不然,他主要接受拟函数对象,但是他肯定是接受常规函数的,只是要保持参数个数、类型以及其返回类型而已。

在《c++程序设计语言》一书的455页就有这么一个函数:

boolless_than_7(intv){
returnv<7;
}

voidf(std::list
<int>&c){
std::list
<int>::iteratorp=find_if(c.begin(),c.end(),less_than_7);
//……
}

在编译器解释find_if()定义的时候,就把上面的_Pred解释成了一个常规函数,而不是一个类对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值