c++リロードとテンプレート

2845 ワード

一、テンプレートは汎用プログラミングの重要なサポートであり、関数とクラステンプレートはSTLの中で非常に広く運用されている.まず、cの中の関数リロードとc++の中の関数テンプレートの違いについて述べる.
1、まず、関数のリロードは関数名が同じであるが、パラメータの個数とカテゴリが異なり、パラメータの個数とパラメータの型別を増やすと、対応するリロード関数を再作成しなければならない.また、テンプレートは可変パラメータ(template,..は0つ以上のパラメータを表す)をサポートします.
2、リロード関数は役割ドメインの問題に注意する必要がある:
class base
{
public:
	void fun(void)
	{
		cout<
上記のように、ベースクラスでは戻りとパラメータが空のfun関数を定義し、派生クラスでは戻りとパラメータがint型の関数funを定義し、従来の考え方ではfun関数をリロードしたと考えられていますが、実際にはそうではありません.両者の関数名が同じであるため、継承過程で派生クラスの関数はベースクラスの関数を上書きします.だからint型の関数だけをリロードしたので、リロードには役割ドメインの問題があります.テンプレート関数は比較的便利で、テンプレートの可視範囲内であれば、1つのテンプレートで複数の関数をインスタンス化することができます.
二、関数テンプレートのマッチング規則
1、一致する関数が1つしかない場合は、その関数を選択します.
2、同じ良い一致関数の中に非テンプレート関数が一つしかない場合、その非テンプレート関数を選択する
3、同じ良い関数に非テンプレート関数がなく、複数の関数テンプレートがあり、そのうちの1つのテンプレートが他のテンプレートより特例化されている場合は、より特例化されたバージョンを選択します(偏特化:偏特化はクラステンプレートにのみ適用され、関数テンプレートには使用できません)
4、そうでないと曖昧で、コンパイルが間違っています.
つまり、コンパイラは常により特殊で、タイプ変換のコストがより少ない(定数への自動変換のプロセスが非常に少ない可能性がある)バージョンを選択します.つまり、コンピュータは「愚か」と「怠け者」で、あなたが与えた情報が多ければ多いほど、操作コストが少なくなり、コンパイラはこのバージョンを選択することをためらうことはありません.
三、可変パラメータテンプレートとsizeof...演算子
可変パラメータテンプレートは、可変数のパラメータを受け入れるテンプレート関数またはテンプレートクラスで、テンプレートパラメータパッケージと関数パラメータパッケージの2つのパラメータパッケージがあります.
template  //Args     

void foo(const T&t,const Args& ... rest)  //rest     
{
    cout<
    cout<

}

 
  

     : , , :

template void f(T);/* a */
template void f(T*);/* b */
template< > void f(int*);/* c */
int* p;
f(p);     //1、        ???

template void f(T);/* a */
template< > void f(int*);/* b */
template void f(T*);/* c */
int* p;
f(p);     //2、         ?


:
のコードブロックについては、aはテンプレートであり、bもテンプレートであり、cはbの にすぎない(template<>は、テンプレートをインスタンス しているか、テンプレートではなくテンプレートをインスタンス しているかを しています) は、 な を バージョンとして するか、 した テンプレート として するかは、 マッチングに します.したがって、 のマッチングの は、テンプレートと テンプレートの でのみマッチングし、テンプレートの と バージョンは に しません.の マッチングは、この テンプレートにマッチングすることを した にのみ、このテンプレートの の バージョンを します!!!
したがって、 1 では、cはbの であるため、 a,bにマッチングしており、pはポインタであるため、bマッチング が であるため、bを したが、コンパイラは にマッチングしたcバージョンがあることを したため、1つのバージョンを しないため、 にcというバージョンの テンプレートを した.
2 :bはaの バージョンで、まずa、cの でマッチングして、cのマッチング がもっと いことを して、cは バージョンがなくて、 cを します(bのマッチングは に しますが、それは にマッチングの を ていないでgameoverになりました);
の はとても いやすい です!!! すべきだ!!!