最終更新日時:
が更新

履歴 編集

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

概要

テンプレートパラメータはほとんどの箇所で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);
}

参照