ProgrammingC++ 開発者

C++におけるテンプレートとは何ですか?どのような種類のテンプレートがありますか?テンプレートの設計および使用においてどのような困難やエラーが発生しますか?クラスと関数のテンプレートの例を示してください。

Hintsage AIアシスタントで面接を突破

回答。

テンプレート (templates) — C++のメカニズムで、異なるデータ型で動作する汎用のクラスと関数を作成できるもので、コードの重複なしに実現できます。これはSTLのコンテナ、アルゴリズム、そして多くの汎用プログラミングパターンの実装の基礎です。

テンプレートの種類:

  • 関数テンプレート: 異なる型用の1つの関数を作成できます。
  • クラステンプレート: 異なる型で動作するクラスを作成できます。
  • 値パラメータテンプレート: 型だけでなく定数値でもパラメトリックにすることができます。

クラステンプレートの例:

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 { ... }

これにより、特殊化は宣言されたが、すべての型に対して正しく実装されていないため、リンクエラーが発生しました。