小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

類模板(原創(chuàng)) - c++探索 - C++博客

 jijo 2009-07-06
            這幾天看了下模板 ,以下是個人的些心得,高手見笑了
1.類模版 實例 對象定義 引起 實例化
                            指針,引用 不會引起實例化
類非型參數(shù)  只能是 整形,枚舉,外聯(lián)結,且應為一個常量編譯時就應確定
                    浮點型,類類型,。。。都不可以
2.class templates 的成員函數(shù) 在調(diào)用和取地址時實例化,在類實例化時不會自動實例化
3.class templates 的友元申明
    a.非模版類型
          friend class man;
          friend void f(void);
           friend void man::f(void);
   b.一對一的模版友元
             friend class man<T>;
             friend void f<T>( man<T>);
             friend void man<T>::f();
    c.一對多的模版友元
          template <typename T>
               friend class man;
           template <typename T>
              friend void  f( T);
           template <typename T>
              friend void man<T>::f();
4.類模版的靜態(tài)成員
      并不在模版定義時實例化,在類模版實例化時實例化,對應1個類型
template <typename T>
int man<T>::size=10;
而成員函數(shù)應為
  template <typename T>
   void man<T>::f(void)
{
..........................................
}
5.成員模版 可以是普通類和 模版類
如:
class woman                                            
{
public:
 template <typename T>
  class man
 {
 public:
  print(T a)
  {
   cout<<a;
   
  }

 };
 template <typename T2>
  void print(T2 a)
 {
  cout<<a;
 };
protected:
private:
};
                         1個好的例子
                           template <typename T>   class A  
                                {      public:
                                                      template <typename T1>               
                                                      A&    operator =(const A<T1> & );
                               }
                               如此 則A 的對象 可以用其他型的對象賦值了
     在使用時才實例化
                                        但是其定義比較駭人
                         template <typename T>
                                     template<typename T1>
                                     A<T>&  A<T>::operator=(const A<T1>& a)
                                   {  ...........................}



6.類模版的特化
      特化1個類模板(所有成員必須特化包括靜態(tài)類數(shù)據(jù)成員(vc),但友元模板(1:1)可以
不特化,當作一個顯示實參的函數(shù)模板處理即可) 或 特化1個模板 成員函數(shù)

         模板成員函數(shù)特化是定義必須出現(xiàn)在實現(xiàn)文件(cpp)中
       語法為
    void man<int>::f(void)
{
............................
}
      
類特化
 template <>
class man<int>
{
       ......//中所有類型參數(shù)以int 替代
};
      
  man<int>::man()
{
......
}

void man<int>::f(void)
{
}
注意  類成員中
   static const 有序類型可以在體內(nèi)初始化static const int a=10;
                        僅僅static  必須在體外
                                                               static int a;
                                                              int woman::a=10;
   非 特化
   template <typename T>
   int man<T>::size=10;
   特化
   int man<char>::size=10;
7偏特化
   類模板有1個以上模版參數(shù)(類型參數(shù),非類型參數(shù))
              某些模版參數(shù) 被實際的型和值取代(注意是 取代 ,不是增加,減少)
      如:

//////////////////頭文件
       template <typename T1,typename T2,int size>
class wc
{
public:
 wc()
 {
  cout<<"\n int T1,T2, int";
 }
protected:
private:
};
template <typename T,int size>
class  wc<T* ,T,size>
{
public:
 wc()
 {
  cout<<"\n in T *, T ,size";
 }
protected:
private:
};
template <typename T,int size>
class  wc<T* ,float,size>
{
public:
 wc()
 {
  cout<<"\n in T* ,float,size";
 }
protected:
private:
};
template <typename T>
class  wc<T* ,float,80>
{
public:
 wc()
 {
  cout<<"\n in T* ,float,80";
 }
protected:
private:
};
///////頭文件
//////main()
wc<int,float,10> wc1;
 wc<int* ,int ,20> wc2;
 wc<int*,float,39> wc3;
wc<int*,float,80>wc4;
///////main() ,在vc 7 上通過
//////main()


8.預設模板參數(shù)(只有在類模板中才指定 ,1 .  明確指定 a<int,int>   ,直接定義時 man<>  kkk;2. a<T,T> )
template <typename T,typename T1=float>
class man
{
..........
}

寫到這里突然想到
                  class A {
                            virtual void   print();
                              };
                  class B:public A {
                                          virtual void print();
                                          };
B b;
                 A *a =&b;
                a->print();//調(diào)用 B的,此時 print()中的this 指針是 B * const,使用B 的接口 ;

9.雙重模板參數(shù)(很有用)
                template <typename T,typename G =man<T> >
 class baby
 {
 public:
  baby ()
  {
   cout<<"\n in baby";
  }
 protected:
 private:
 };//類型參數(shù)可以是 類類型
        
baby<int, man<float> > b;  //ok
////////////////////////
template <typename T,template <typename G> class TT>//可以省略為 template <typename T  ,template<typename>  class  TT>
 class  son
 {
 public:
   TT<T> * a; 
     son()
  {
           a=0;
   cout<<"\n in son";
  }
 protected:
 private:
 };
   son<int, man> b;//則就含有了 man<int > * a;
TT 是模板占位符號,是一個帶1個類型參數(shù)的類模板,如果其有默認模板參數(shù) 則忽略掉  
所以 GG若帶默認 的模板 應該如下
            template <typename T, template <typename T2, typename= man<T2>  > class GG>
class son
{
}

/////////   類模板類型參數(shù) 同時還可以是 類模板

10. 字符串常量在模板中的注意事項

           char * a="hi ,friend ";///"hi, friend"  文字常量 是 const char [10] 類型  左值轉換到 const char *
限定轉換到 char *,
                template <typename T〉
      ostream& operator <<(ostream & os, const T & b);//注意只有const 才能接受臨時變量

             cout<<"hi,friend";  
              cout<<"bad";
/////2個不同的模板實例
   typeid(變量).name();///直接打印出變量類型
寫到這,閑扯下:
    棧區(qū),堆區(qū),全局(靜態(tài))區(qū),文字常量,代碼區(qū),5個大區(qū),這個是我聽說的
////////////////////////////////////////////////
11.模板的編譯模型
     在實例化點必須能找到定義//原則
                           只能使用包含模式了,
a..h. cpp 在 .h最后一行包含進 cpp
b. 全部在h 或 cpp

                     分離模式,目前支持的export 關鍵字i的編譯器很少(vc.net 不支持)


12.
函數(shù)指針類型也能做模板類型參數(shù)

bool  minn( int  a, int  b)
{
     
return  a < b;
 }


 template 
< typename T1,typename T2 >
    
const  T1 &   mymin( const  T1 &  t1,  const  T1 &  t2, T2 t3 )
 
{
     
return  t3(t1,t2) ? t1:t2;
 }

void  main()
{
cout
<< mymin( 2 , 3 ,minn);
}


13.
模板參數(shù)可以是個類模板  
template <typename T>
class a
{
};
a< vector <int> >;


template <typename T, typename T2,template <typename T,typename T2> class con  >
void add(con<T,T2>,con<T,T2>)
{
 cout<<"ok";
}

add(a,b)//特殊在于 需要推導,vc 7 可以從  類模板中推導出參數(shù)類型

template <typename T,template <typename T2,typename T3> class con >
class ggoo
{
public:
 con<T,T> a;
con<int,int> b;

protected:
private:
};

ggoo<int,double, b> kk;//b<int,double>, con 的模板參數(shù)可以任意
 


    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多