#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模板