メインコンテンツにスキップ
モジュール 8 · レッスン 2 / 2コース内の 18/18~15 min
モジュールのレッスン (2/2)

クラステンプレート

関数と同様に、クラスも 1 つ以上のデータ型に関してパラメータ化できます。これにより、コードを複製することなく、あらゆるデータ型を処理できる汎用データ構造 (リスト、キュー、スタック、ラッパーなど) を定義できるようになります。

クラステンプレートの定義

クラス テンプレートを宣言するには、クラス定義の直前で template <typename T> 構文を使用します。クラス内では、型パラメーター T を使用して、メンバー変数、戻り値の型、またはメンバー関数パラメーターを定義できます。

C++
template <typename T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}

    T getValue() const {
        return value;
    }
};

インスタンス化

クラス テンプレートのオブジェクトを作成するときは、山括弧 <> の間に型を明示的に指定する必要があります (ただし、C++17 以降では、コンパイラーは、クラス テンプレート引数の推定 または CTAD を介して一部のコンテキストで型を推定できます)。

C++
Box<int> intBox(10);        // T becomes int
Box<double> doubleBox(3.14); // T becomes double

テンプレートの特化

場合によっては、クラス テンプレートが特定の型でインスタンス化されたときに、異なる動作が必要になることがあります。この場合、template <> 構文とその後にターゲットの型を指定するクラス定義を使用して 完全な特殊化 を定義します。

C++
// Total specialization for the bool type
template <>
class Box<bool> {
private:
    bool value;
public:
    Box(bool v) : value(v) {}

    void printState() {
        std::cout << (value ? "True" : "False");
    }
};

自分で試してみてください

運動#cpp.m8.l2.e1
試行回数: 0読み込み中…

Box という名前のクラス テンプレートを宣言します。このテンプレートには、型 T の value という名前のプライベート メンバー、それを初期化するコンストラクター、および値を返すパブリック メソッド getValue() const が含まれます。

エディターを読み込み中…
ヒントを表示

「Box」クラス宣言の先頭に「template <typename T>」を忘れずに追加してください。

3 回の試行後に解決策が利用可能になります

運動#cpp.m8.l2.e2
試行回数: 0読み込み中…

型 T のパブリック メンバー データ、コンストラクター Wrapper(T d)、およびデータを std::cout に出力する print() メソッドを使用して、クラス テンプレート Wrapper<T> を宣言します。次に、Wrapper<char> の完全な特殊化を作成します。ここで、print() メソッドは一重引用符で囲まれた文字 (たとえば、A の代わりに 'A') を出力します。

エディターを読み込み中…
ヒントを表示

`template <>` を使用して、`Wrapper<char>` の完全な特殊化を示します。

3 回の試行後に解決策が利用可能になります