胡说八道

学而不思则罔,思而不学则殆

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
一个CSDN上的贴子:
 我现在有一个类
     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的时候编译器回给出错误.

posted on 2004-12-29 11:34  胡说八道  阅读(505)  评论(0)    收藏  举报