具有部分固定参数列表的 C++ 模板

c++ template with partially fixed argument list

考虑如下案例:

template<typename T>
class A { ... };

template<typename T, typename DataType = std::vector<A<T>>>
class B {
  ....
  DataType data;
  ...
}

在我的例子中,DataType 类型可以是任何标准的“容器”,但它必须始终专门针对类型 A。A 的使用应该对外部 class B 透明,但是在 B 的定义中没有 DataType 的默认类型,应该明确指定例如B<int, std::deque<A<int>>。我想消除这种可能性并实现类似的目标:

template<typename T, typename container = std::vector>
class B{
  using DataType = container<A<T>>;
  ...
}

这样我就可以像 B<int, std::vector> 那样专攻 B。 当然它不能完全像这样,因为 container 在这种情况下应该是一个完整的类型,然后必须是特化的。有没有办法用 c++14 实现这个?

您可以使用 template template parameter 来完成,例如

template<typename T, template <typename...> typename container = std::vector>
class B {
  using DataType = container<A<T>>;
  ...
};

然后像 B<int>(即 B<int, std::vector>)或 B<int, std::deque> 一样使用它。