テンプレート (templates) — C++のメカニズムで、異なるデータ型で動作する汎用のクラスと関数を作成できるもので、コードの重複なしに実現できます。これはSTLのコンテナ、アルゴリズム、そして多くの汎用プログラミングパターンの実装の基礎です。
テンプレートの種類:
クラステンプレートの例:
template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };
関数テンプレートの例:
template<class T> T add(const T& a, const T& b) { return a + b; }
テンプレートクラスのメソッドのみを明示的に特殊化することはできますか?クラス全体を特殊化せずに?できるなら、どうやって?
回答:
はい、できます。クラス全体を特殊化する必要はありません;単に特定のメソッドを特殊化できます:
template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // int用のメソッドbarの特殊化 // 実装 }
物語
プロジェクトで比較用の関数テンプレートが書かれました:template <typename T> bool cmp(const T& a, const T& b) { return a < b; }
<オペレーターを持たない型を使用した際にコンパイルエラーが発生し、テンプレートのインスタンス化時にのみ診断されるため、問題を長時間探しました。
物語
開発者はカスタムクラスに対して加算を使用しようとしたが、+オペレーターをオーバーロードするのを忘れました。これにより、そのクラスで最初に呼び出した際にコンパイルエラーが発生しました。
物語
クラステンプレートに基づくコンテナの開発時に、テンプレートの型に依存しないメソッドが作成されましたが、明示的な特殊化なしにクラスの外に出されました:template<> int MyContainer<int>::size() const { ... }これにより、特殊化は宣言されたが、すべての型に対して正しく実装されていないため、リンクエラーが発生しました。