函数模板特化 遇到 函数重载

来源:互联网 发布:百度人工智能智库 编辑:程序博客网 时间:2024/05/20 00:13

#include"stdafx.h"#include<iostream>#include<ostream>#include<istream>template <class T>class Foo{public:static long count(){return ctr;}private:static  long ctr;};template<class T>long Foo<T>::ctr = 11;template<class T>int compare(const T& ls,const T& rs){std::cout<<ls;if (ls<rs)return -1;if (rs<ls)return 1;return 0;}template<>int compare<const char*>(const char* const &ls,const char* const &rs){std::cout<<"out";if (*ls<*rs)return -1;if (*rs<*ls)return 1;return 0;}

(1)

      对于函数模板compare传入两个字符指针时,比较的是两个指针在内存中的地址大小,所以我们需要对该函数模板进行特化。

      不过在特化之前考虑添加一个重载函数(不知道这里用重载是否合适)

       int compare(const char*ls,const char*rs)

      此时 int y = compare("a","b")调用的是int compare(const char*ls,const char*rs)(求高人解答,为何调用是遢而不是实例化的函数模板)

      然而  y = compare(aaa,b)调用的是实例化的函数模板;

(2)      

     但是如果我们用compare函数的特化 

template<>int compare<const char*>(const char* const &ls,const char* const &rs){std::cout<<"out";if (*ls<*rs)return -1;if (*rs<*ls)return 1;return 0;}


     用如下测试代码     

char *aaa = "a";char *b = "b";int y = compare(aaa,b);std::cout<<y<<'\n';y = compare("a","b");std::cout<<y<<'\n';

     结果是

       a1

       a1


     

     将指针aaa和b所指向的值互换,  

char *aaa = "b";char *b = "a";int y = compare(aaa,b);std::cout<<y<<'\n';y = compare("a","b");std::cout<<y<<'\n';

     结果为

       b-1

       a1


     说明compare(aaa,b)执行了

     std::cout<<rs代码段,

       用的是实例化的函数模板,但却是用指针的值进行比较。(不懂此过程的调用方法)


(3)

在字符指针上加上  const 

constchar *aaa = "b";constchar *b = "a";int y = compare(aaa,b);std::cout<<y<<'\n';y = compare("a","b");std::cout<<y<<'\n';     

     结果为

       out1

       a1


     此时compare(aaa,b)调用的是特化的compare模板