このページはC++17に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
テンプレートパラメータはほとんどの箇所でclass
キーワードとtypename
キーワードの両方を使用できたが、テンプレートテンプレートパラメータのクラステンプレート部分についてはclass
キーワードしか使用できなかった。
// `class X`部分については、typenameを使用できなかった
template <template <typename... Args> class X>
class Y;
C++17では、テンプレートテンプレートパラメータでもtypename
キーワードを使用できることとなった。
// `typename X`と書けるようになった
template <template <typename... Args> typename X>
class Y;
例
#include <vector>
template <template <typename...> typename Container>
class X {
// コンテナのクラステンプレートをテンプレートパラメータで受け取って、
// 要素型はあとで指定する。
Container<int> c_;
public:
void add(int x)
{
c_.push_back(x);
}
};
int main()
{
X<std::vector> x;
x.add(3);
x.add(1);
x.add(4);
}