模板模板集合接受另一个模板参数

时间:2017-11-28 18:25:42

标签: c++ templates generic-programming

我试图围绕模板模板如何工作来实现类似的功能,如下所示。

考虑两个类(在Java中)。第一个类是通过指定只能存储第二个模板参数的对象来限制pack方法返回的集合:

abstract class ContainerPacker<T, Container extends Collection<T>> {
    abstract Container pack(T t);
}

这个类的实现,比方说,Integer类型可能如下所示:

class IntegerContainerPacker extends ContainerPacker<Integer, List<Integer>> {
    @Override
    List<Integer> pack(Integer t) {
        List<Integer> list = new ArrayList<>(t);
        list.add(t);
        return list;
    }
}

现在我想在C ++中使用模板模板做类似的事情。请注意Container本身是如何模板的:

template <typename T, template <typename U> class Container>
class ContainerPacker {
  public:
    virtual Container<T> pack(T) = 0;
};

我在实施它时遇到了麻烦。以下代码无法编译:

class IntegerVectorPacker : public ContainerPacker<int, std::vector> {
  public:
    std::vector<int> pack(int t) {
        std::vector<int> v = std::vector<int>();
        v.push_back(t);
        return v;
    }
};

错误是:

  

错误:模板参数列表中参数2的类型/值不匹配'模板类容器&gt; class ContainerPacker'    class IntegerVectorPacker:public ContainerPacker {

  

注意:期望一个'模板类容器'类型的模板,得到'模板类std :: vector'

我一直在寻找答案,但要弄清楚要问的问题甚至很难。模板模板很难。

1 个答案:

答案 0 :(得分:1)

尝试

template <typename T, template <typename...> class Container>

代码中的问题(问题?)是std::vector是一个模板类,它接收多个模板参数(两个:第二个具有默认类型);所以不匹配Container

Container定义为接收零个或多个模板应该允许与std::vector<int>(真正是std::vector<int, std::allocator<int>>)和其他容器匹配。

- 编辑 -

我现在看到你有这个问题的标签C ++而不是C ++ 11(或更新)。

typename...建议仅从C ++ 11开始有效,因为变量模板以前不可用。

对于C ++ 98,您可以编写

template <typename T, template <typename, typename> class Container>

但这仅适用于两个参数容器。

- 编辑2 -

关闭主题建议。

如果您可以使用C ++ 11或更新版本(因此可变参数模板)切换Container的{​​{1}}和T的顺序,并且变换ContainerPacker是可变参数包;

之类的东西
T

它更加灵活。