モジュールのレッスン (2/2)
クラステンプレート
関数と同様に、クラスも 1 つ以上のデータ型に関してパラメータ化できます。これにより、コードを複製することなく、あらゆるデータ型を処理できる汎用データ構造 (リスト、キュー、スタック、ラッパーなど) を定義できるようになります。
クラステンプレートの定義
クラス テンプレートを宣言するには、クラス定義の直前で template <typename T> 構文を使用します。クラス内では、型パラメーター T を使用して、メンバー変数、戻り値の型、またはメンバー関数パラメーターを定義できます。
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
T getValue() const {
return value;
}
};インスタンス化
クラス テンプレートのオブジェクトを作成するときは、山括弧 <> の間に型を明示的に指定する必要があります (ただし、C++17 以降では、コンパイラーは、クラス テンプレート引数の推定 または CTAD を介して一部のコンテキストで型を推定できます)。
Box<int> intBox(10); // T becomes int
Box<double> doubleBox(3.14); // T becomes doubleテンプレートの特化
場合によっては、クラス テンプレートが特定の型でインスタンス化されたときに、異なる動作が必要になることがあります。この場合、template <> 構文とその後にターゲットの型を指定するクラス定義を使用して 完全な特殊化 を定義します。
// 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");
}
};自分で試してみてください
Box という名前のクラス テンプレートを宣言します。このテンプレートには、型 T の value という名前のプライベート メンバー、それを初期化するコンストラクター、および値を返すパブリック メソッド getValue() const が含まれます。
ヒントを表示
「Box」クラス宣言の先頭に「template <typename T>」を忘れずに追加してください。
3 回の試行後に解決策が利用可能になります
型 T のパブリック メンバー データ、コンストラクター Wrapper(T d)、およびデータを std::cout に出力する print() メソッドを使用して、クラス テンプレート Wrapper<T> を宣言します。次に、Wrapper<char> の完全な特殊化を作成します。ここで、print() メソッドは一重引用符で囲まれた文字 (たとえば、A の代わりに 'A') を出力します。
ヒントを表示
`template <>` を使用して、`Wrapper<char>` の完全な特殊化を示します。
3 回の試行後に解決策が利用可能になります