コンテンツにスキップ

クラステンプレート

クラスに対するテンプレートをクラステンプレートといいます。 クラステンプレートを定義するには次のようにします。

template <typename T>
class Rectangle {
 public:
    Rectangle(T height, T width) : height_(height), width_(width) {}

    T Area() const {
       return height_ * width_;
    }

 private:
    const T height_;
    const T width_;
};

クラステンプレートのクラスのオブジェクトを生成するには次のようにします。

Rectangle<int> r1(10, 20);
Rectangle<double> r2(1.2, 3.4);

クラステンプレートではテンプレート実引数を省略することはできません。

テンプレート引数が必要なのはオブジェクト生成時のみで、 生成後は通常のクラスと同様に使用することができます。

r1.Area();  // 200
r2.Area();  // 4.08

複数のテンプレート引数

パラメータ化する型やコンパイル時に定まる値は クラステンプレートでも複数にすることができます。

template <typename T, typename U>
class Rectangle {
 public:
    Rectangle(T height, U width) : height_(height), width_(width) {}

    double Area() const {
       return height_ * width_;
    }

 private:
    const T height_;
    const U width_;
};

この例ではメンバ関数 Area() の戻り値を double に固定して テンプレート引数を2つにしています。

メンバ関数の戻り値の型推論

クラステンプレートでメンバ関数の戻り値の型を推論するには decltype 内で std::declval を使用します。

template <typename T, typename U>
class Rectangle {
 public:
    Rectangle(T height, U width) : height_(height), width_(width) {}

    auto Area() const -> decltype(std::declval<T>() * std::declval<U>()) {
        return height_ * width_;
    }

 private:
    const T height_;
    const U width_;
};

コンパイル時に定まる値のパラメータ化

コンパイル時に定まる値のパラメータ化はクラステンプレートでも使用できます。

template <typename T, int N>
class Array {
 public:
    int size() const {
       return N;
    }

    T data_[N];
};