C++模板中部分固定参数列表是什么意思?

4

考虑以下情况:

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

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

在我的情况下,DataType 类型可以是任何std“容器”,但它必须始终以类型A进行特化。对于类B外部的使用来说,A的使用应该是透明的,但是在没有为 DataType 指定默认类型的情况下,在定义B的时候,应该明确地指定如下: B<int,std :: deque<A<int>>。我希望删除这种可能性,并实现类似以下的功能:

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

我希望能够像这样专门化B:B<int, std::vector>,但实际上是不可能的,因为在这种情况下,container 应该是一个完整的类型,必须进行专门化。在C++14中有没有办法实现这个?


template <typename...> typename Container = std::vector。但我质疑这是否是一个好主意,因为如果有人想传递带有自定义分配器的容器会怎样呢?等等。 - HolyBlackCat
1个回答

6

你可以使用 模板模板参数 来实现,例如:

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>


template<typename ...> 这种语法叫什么名字,我可以查找文档吗? - Nicola Lissandrini
1
@NicolaLissandrini 请参阅参数包 - songyuanyao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接