我现在有一个类
template<class T, std::size_t N>
class Array {...};
需要实现如下函数
void MyFunc(const Array<float, 3>& x, const Array<float, 4>& y);
void MyFunc(const Array<double, 3>& x, const Array<double, 4>& y);
...
请问如何用一个模板函数来实现?进一步实现如下形式则更好了
template<...> // 我不知道怎么办,简单地传递类型参数无法通过(VC 7.1)
void MyFunc(const Array<T, N-1>& x, const Array<T, N>& y)
再进一步
template<...> // 我不知道怎么办
void MyFunc(const Array<T1, N-1>& x, const Array<T2, N>& y)
首先第一感觉是写成下面的形式:
template<class T,std::size_t N,std::size_t N1>
void MyFunc(const Array<T,N>& x,const Array<T,N1>& y);
但是这里体现不出N和N1之间的关系,也就是说任意的N,N1都能正常的实例化,那么我们如何做到约束于那样的关系呢(N=N1-1)?
template<typename T,int N>
void MyFunc(const Array<T,N>& t1,const Array<T,N-1>& t2);
这个是最直接的想法,可惜上面的声明调用的时候只能显式的给出两个参数MyFunc<int,10>(...),不然编译器不能得到正确的参数(可能有更加好的直接的声明方式,这个我不是很清楚).我们有没有什么办法能达到我们的目的呢?我们的目的有两点,第一不用显式的给出参数,第二要保证当N,N1满足我们的约束条件才能正确的实例化.
中间层,我们又一次的使用了这个"万能"的方法.
我们的真实调用的函数还是
template<typename T,int N>
void MyFunc(const Array<T,N>& t1,const Array<T,N-1>& t2);
但是我们不直接调用这个函数来完成我们的任务,我们新写一个函数来完成原始函数的包装
template<typename T,int N,typename T1>
int MyFuncWap(const Array<T,N>& t1,const T1& t2)
{
return MyFunc<T,N>(t1,t2);
}
这样我们就达到了我们的目的,第一,MyFuncWap调用的时候分成两次分析参数,第一次分析出T和N,然后内部的显式的调用实现函数MyFunc<T,N>这样我们就不需要显式指定参数了.第二,如果N,N1不满足约束条件,那么在实例化MyFunc的时候编译器回给出错误.

浙公网安备 33010602011771号