关于模板定义一个模板函数,C/C++ codetemplate typename Tint compare(const T& val1, const T& val2 ){
关于模板
定义一个模板函数,
- C/C++ code
template< typename T>int compare(const T& val1, const T& val2 ){ if( val1 > val2 ) return 1; else { if( val1 == val2 ) { return 0; } else { return -1; } }}可是这个函数对于指针比较的是指针所指向的地址,而不是指针所指向的内容,请问该如何改,才能使的这个函数比较的是指针的内容 ,
请指教
[解决办法]
要想既保持compare函数的接口(意即不另写一个专门函数),而又要解决这个问题,可能想到的办法就是对该函数模板进行特化,但你不可能对一个函数模板进行局部特化,例如:
template< typename T>
int compare<T*>(const T val1, const T& val2 )//error!语言暂时还不能支持函数模板的局部特化!
{
//......
}
其次,能想到的办法就就是对该函数模板实施重载,如二楼朋友的建议,但这同样是行不通的(因可能有重载解析多义性之故)!即使某一编译器能够通过这一重载,也并不代表这种重载的策略具有可移值性。至少在我的Gcc、VC7.1及BC6.0编译器上不能解决楼主对compare模板的需求。
但是请不要悲观,请看我的如下程序及注释,可以作为楼主问题的解:(就算抛砖引玉吧!)
#include<ZHOUStd.h>
using namespace std;
//增加一个用于约束条件测试的模板:
template<typename T>//本模板用于肯定T不是一个指针!
class IsPtr
{
public:
enum { Is = false };
};
//为上述模板作一个指针类型的局部特化!(荣幸,语言支持类的局部特化)
template<typename T>//本模板用于肯定T是一个指针!
class IsPtr<T*>
{
public:
enum { Is = true };
};
template<typename T>
int compare(const T& val1, const T& val2 )
{
if(IsPtr<T>::Is)//在楼主的模板中加入约束条件测试!
{
//当T是指针的时候:
//如下重新解释操作用于消除编译期错误:
T const* _pa = reinterpret_cast<T const*>(val1);
T const* _pb = reinterpret_cast<T const*>(val2);
if( *_pa > *_pb ) return 1;
else
{
if(*_pa == *_pb)
{
return 0;
}
else
{
return -1;
}
}
}
else
{
//当T类型不是指针:
if( val1 > val2 ) return 1;
else
{
if(val1 == val2)
{
return 0;
}
else
{
return -1;
}
}
}
}
int main()
{
//如下程序段将向屏幕输出"相等"!
long a = 12,b = 12;
compare(a,b) ? cout << "不相等!" : cout << "相等!";
cout << endl;
compare(&a,&b) ? cout << "不相等!" : cout << "相等!";
cout << endl;
//如下程序段将向屏幕输出"不相等"!
long c = 12,d = 13;
compare(c,d) ? cout << "不相等!" : cout << "相等!";
cout << endl;
compare(&c,&d) ? cout << "不相等!" : cout << "相等!";
cout << endl;
_PAUSE;//一个利于观察的宏!
}
如上注释,该程序在我的VC7.1、BC6.0编译器上行为良好,可以满足楼主的需求!当然会有一些编译期警告!但GCC则没有任何警告,程序行为一如预期!
