【C++テンプレート】特化と偏特化template[partial]specialization

2297 ワード


1 template specializationテンプレート特化
一般的にクラステンプレートは次のように定義されます.
template<class Window, class Controller>
class Widget
{
    ...        ...
};
特化とは、クラステンプレートに指定されているclass Tを具体的なタイプにすることです.
class Widget<ModalDialog, MyController>
{
    ...        ...
};
ModalDialogとMyControllerはあなた自身が別途定義したクラスです.
このWidgetの特化定義がある後、Widgetオブジェクトを後で定義すると、コンパイラは上記の特化定義を使用します.
他の汎用オブジェクトが定義場合、コンパイラは元の汎用化定義を用いる.
これがテンプレートの特化です.
2 template partial specializationテンプレートの偏特化
テンプレートの特化は、「テンプレート内のすべてのテンプレートパラメータに具体的なクラスを与える」ことによって実現する.テンプレートの偏特化は、「テンプレートの一部のテンプレートパラメータを具体的なクラスで与える、残りのテンプレートパラメータを元の汎化定義で残す」ことによって実現する.
template<class Window>                        //           ;
class Widget<Window, MyController>            //MyController     ,     ;
{
    ...         ...
};
テンプレートの偏特化能力は非常に強い.テンプレートをインスタンス化すると、コンパイラは現在存在する偏特化テンプレートと全特化テンプレートを比較し、その中で最も適切で、最も一致する実現を見つけます.
これにより、柔軟性が大きい.
テンプレートの偏特化メカニズムは、メンバー関数であろうと非メンバー関数であろうと、関数に使用できない.
3注意
  • クラステンプレートのメンバー関数をフル特化できますが、彼らを偏特化することはできません.
  • 名前空間レベル(namespace-level)の関数(non-member)を偏特化することはできません.「ネーミングスペースレベルテンプレート関数」に最も近い偏特化メカニズムは、関数の再ロードです.これは、戻り値タイプや内部で使用されるタイプではなく、関数パラメータに精緻な特化能力があることを意味します.
  • 特化または全特化の場合、templateの後ろのカッコには何も入っていません.

  • Author: visaya fan 
    Date: 2011-10-21 17:30:04
    HTML generated by org-mode 6.33x in emacs 23