THE C++ STANDARD LIBRARY中的一句话的理解

lx_cyh 2003-01-05 03:39:41
p257
Note that the sorting criterion PersonSortCriterion is a type. Thus, you can use it as a template argument for the set. This would not be possible, if you implement the sorting criterion
as a plain function (as was done on page 123).
我认为用函数指针可以做到 “This would not be possible,”???
...全文
45 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
J2eeLearner 2003-01-08
无论是用function还是functor,都能够完成这个这里的“比较”任务!

只是如果你是用Function,按照我知道的,那么你必定是让他作为函数的参数,而这个参数是一个指针,

如果你用Functor,那么你可以把Functor作为模板参数, 这里优化多多了!

//
你那样的用法,我还没看到过,也就是说不用functor,而用function, 能用它作为模板参数实现吗?
回复
lx_cyh 2003-01-07
to J2eeLearner(jinfeng_Wang):
对于我开始的提问。是不是如下理解更好一点:

typedef bool (pFun*) (int,int);

bool Compare(int i, int j);

void sort( pFun pCompare );

main()
{
...
sort(&Compare); // 这个参数属于函数参数
...
}

template<typename T> class sort{
....
}

sort<pFun> mySortObject;
即使合法,却无法做到像这样 sort<Compare> mySortObject,即真正的比较标准传不进来(因为Compare不是类型)。

而把Compare做成一个类型(class),一切搞定。

回复
earthharp 2003-01-06
函数指针可以的。
当然可以。
回复
BorlandC 2003-01-06
Function Objects should be used!
回复
J2eeLearner 2003-01-06
函数指针是否可以作为模板参数,我还不敢确定! 不过还真的没看到过,如果不可以,估计也是因为类型推导比较复杂的缘故。 STL里面都是使用的Functor完成的。曾经这么想过,有了Functor,C++程序还需要Function么? :)
回复
J2eeLearner 2003-01-06
差也,差也!
排序的标准 是什么?如果简单的说,就是类似operator<()的东西,也就是一个函数而已,而函数只能用函数指针带入
例如:
typedef bool (pFun*) (int,int);

bool Compare(int i, int j);

void sort( pFun pCompare );

main()
{
...
sort(&Compare); // 这个参数属于函数参数
...
}

而Functor是一个类型(class)
class Compare
{
bool operator(int i, int j)
{ ....}
};

template <class T> sort ()
{
....
}

int main()
{
...
sort<compare> () //大致的写成这样,这里的比较是作为模板参数带入的
...
}

//
比较上面的不同吧,Functor可以比Function多好多东西,比如说Functor里面可以有数据成员,用于保存每个Functor object的内部状态 , :)

回复
shornmao 2003-01-06
他的意思是类型可以作为模板参数,而函数指针不可以。
至于作为模板参数的意义,则在于,即使成员类型相同,而排序准则相同,那么两个容器也是类型不同的。
回复
lx_cyh 2003-01-06
我似乎有点明白了
typedef int (*f)();
template <typename T> class MyClass {
.....
}
MyClass <f> a ;//这句非法吗?我认为不非法
我认为问题的关键是排序的标准无法传入MyClass(像标准C库qsort的比较函数那样), f只是类型。如果f做成类就可以了。
另外,为了感谢大家的回答,此贴我将加成100分
回复
J2eeLearner 2003-01-06
另外,作为一个类型来说,(我觉得这里就是一个Sort Functor),比单纯的Function有很多的优越性! Functor,Function两者的使用区别是比较大的,这里Function不能作为模板参数就是一个例子!
回复
J2eeLearner 2003-01-06
类型可以作为模板参数,而函数指针只能作为“函数的参数”

这两个参数是不一样的。

另外,模板参数是在实例化时候确立的,也就可以在编译连接其间得到优化。
回复
guyu_jj 2003-01-05
译:注意排序准则(PersonSortCriterion是一个类名)是一个类型,因此,你能。。。
回复
asvaboy1980 2003-01-05
gz
回复
发动态
发帖子
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
社区公告
暂无公告