在STL中的functor(仿函数)的另一用处:当模板函数必须要进行偏特化时

来源:互联网 发布:怎么禁止程序访问网络 编辑:程序博客网 时间:2024/06/11 07:41

在网上查找仿函数的时候,大多数文章说的仿函数可以提取出算法的本质,将算法的思想单独的整合出来,而与输入的元素是什么样的无关。这确实是正确的,但是在写STL的过程中,我发现有些仿函数他们的目的并不是要单独将算法的思想提取出来更方便使用,因为STL中有的仿函数根本就与算法什么的无关,那么他们的作用是什么?

我找了好多帖子都没找到,而且搜索引擎找到的东西好多都是一样的,都是从一个文章或是博客copy过来的,无外乎仿函数的作用都是“提取出算法的本质,让它尽量与输入无关”

但是我认为STL中还有一个其他的用法:当你想将一个模板函数偏特化的时候,那么此时这个“函数”就要写成仿函数。在《effective C++》中写道“模板函数不可以偏特化”,具体在哪一章节刚才我找了但是没有找到==,不过我在网上查找到模板函数确实不能偏特化。

下面就来解释我这个观点:
当我在smart_algorithm.h中增加copy算法的时候,copy函数是个重载函数,包括泛化版本

template<class InputIterator, class OutputIterator>inline OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result){    return _copy_dispatch(first, last, result);}

以及两个函数版本:

inline char* copy(char* first, char* last, char* result)
inline wchar_t* copy(wchar_t* first, wchar_t* last, wchar_t* result)

那么我们就要对泛化版本的copy进行进一步的分类,即在copy泛化版本中增加调转函数_copy_dispatch(first, last, result);,对于泛化版本,我们为了追求它的效率,可以进一步将它细分,分成:
1.普通的迭代器版本;
2.原生指针,被copy的指针是T*类型,要copy的是T*
3.同样是原生指针,被copy的指针式const T*类型,要copy的是T*类型;

当我们将_copy_dispatch(first, last, result);要分成几类考虑清楚后,问题就来了,因为_copy_dispatch(first, last, result);可以分成2.原生指针T*和3.原生指针const T*,所以我们就要对_copy_dispatch(first, last, result);进行偏特化。
但是!!!我在前文已经说了,模板函数时无法偏特化的,此时就产生了矛盾,而我们如果将_copy_dispatch(first, last, result);设置成仿函数的话便可以解决这个问题。
即将_copy_dispatch设置成struct。

0 0
原创粉丝点击