使用模板容器制作模板类

时间:2018-04-07 01:40:26

标签: c++ templates inheritance containers c++17

在阅读this thread之后,我写下了:

template <typename T, template <T> typename C> class Base

基类包含&#39; C&#39;包含&#39; T&#39;的类型容器类型对象。

我的问题是当我尝试创建派生类时:

class Derived : public Base

第一个错误是

  

缺少类模板的参数列表。

所以我想我必须告诉模板Base类我将使用哪种类型。因此,假设我的派生类将有一个&#39; std::set&#39;对于具有整数的容器。

class Derived : public Base <int, set<int>>

但它&#39; std::set<int>&#39;用红色加下划线,它告诉我它不是模板类&#34;。

我不确定我做错了什么。

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

模板类型名称C&gt;   class Base

     

基类包含一个包含'T'类型对象的'C'类型容器。

C不是std::set之类的容器。我的意思是:C没有收到模板类型参数作为STL容器。

使用Base,您可以写

template <int>
struct foo
 { };

template <typename T, template <T> typename C>
class Base
 { };

class Derived : public Base <int, foo>
 { };

其中foo接收整数,而不是类型。

如果您想要std::set作为第二个参数,可以写

template <typename T, template <typename...> typename C>
class Base
 { };

其中C收到可变参数类型列表(std::set接收三个模板类型参数;第二个和第三个默认为默认值。

所以你可以写

class Derived : public Base <int, std::set>
 { };

另一种方法是将Base写为接收单一类型并使用部分特化来解析容器和容器模板参数

template <typename>
class Base;

template <template <typename...> typename C, typename A0, typename ... As>
class Base<C<A0, As...>>
 { };

因此您可以直接传递类型std::set<int>(使用默认模板类型),如下所示

class Derived : public Base <std::set<int>>
 { };