最終更新日時(UTC):
が更新

履歴 編集

テンプレートテンプレートパラメータにtypenameキーワードの使用を許可 [N4051](C++17)

このページは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);
}

参照