STLのテンプレート知識

2340 ワード

非タイプのテンプレートパラメータの制限


非タイプのテンプレートパラメータは、定数式または外部リンク属性を持つ変数のアドレス(他人の文章やコンパイラのヒントに基づいて推定される)でなければなりません.例:
template 
class MyClass {};
MyClass<5> x;

Implicit Instantiate/暗黙的インスタンス化


暗黙的なインスタンス化は、関数テンプレートの呼び出し中に発生するか、クラステンプレートを使用してオブジェクトをインスタンス化する過程で発生します.
コンパイラが関数テンプレートのテンプレートパラメータを推定できる場合、テンプレートパラメータは省略できます.コンパイラはクラステンプレートのテンプレートパラメータを推定できないので、テンプレートパラメータを省略することはできません.後の表示のインスタンス化と具体化もそうです.

Explicit Instantiate/明示的インスタンス化


関数テンプレートを明示的にインスタンス化するには、templateキーの後続関数の宣言(定義ではありません)、関数識別子の後続テンプレートパラメータを使用します.
template float twice(float original);

コンパイラがテンプレートパラメータを推定できる場合、テンプレートパラメータは省略できます.
template float twice(float original);

クラステンプレートを明示的にインスタンス化するには、templateキーの後にクラスの宣言(定義ではありません)を接続し、クラス識別子の後にテンプレートパラメータを接続します.
template class Array;

クラスを明示的にインスタンス化する場合は、すべてのクラスメンバーもインスタンス化する必要があります.

Specialize/特殊化/具体化


関数テンプレートを特殊化するには、template<>キーの後に関数の定義を接続し、関数識別子の後にテンプレートパラメータを接続します.
template<> void swap(job &a, job &b) {……}

コンパイラがテンプレートパラメータを推定できる場合、テンプレートパラメータは省略できます.
template<> void swap(job &a, job &b) {……}

クラステンプレートを特殊化するには、template<>キーの後にクラスの定義を接続し、クラス識別子の後にテンプレートパラメータを接続します.
template<> class Array {……};

その他


関数の再ロードによって解決できると考えているため、関数テンプレートを局所的に特化することはできません.
c++必須item 48は、プライマリ・テンプレートのメンバー関数のサブセットのみを特化することができ、インスタンス化時にクラスが選択したプライマリ・テンプレートであるにもかかわらず、クラスのメンバー関数は特化バージョンを選択することができる.ただし、メンバー関数を特化するインタフェースは、プライマリテンプレートが提供するインタフェースと正確に一致する必要があります.
c++必須item 55テンプレートのテンプレートパラメータテンプレートのパラメータは、通常のタイプ、クラスだけでなく、テンプレートstlのlistの宣言にもなります.
template  >
class list;

リストを定義するには、次のようにします.
list  > m;

エレメントとコンテナのタイプを手動で調整する必要があります.
template  class Alloc=std::allocator>
struct List
{
};

Allocはテンプレートパラメータが必要なテンプレートクラスで、定義が簡単です.
List n;