【发布时间】:2018-05-12 07:39:13
【问题描述】:
我正试图围绕模板模板如何工作以实现如下所示的类似功能。
考虑两个类(在 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;
}
};
错误是:
错误:“模板类 Container> 类 ContainerPacker”的模板参数列表中参数 2 的类型/值不匹配 类 IntegerVectorPacker : 公共 ContainerPacker {
和
注意:需要一个“模板类容器”类型的模板,得到“模板类 std::vector”
我一直在寻找答案,但很难弄清楚要问什么问题。模板模板很难。
【问题讨论】:
-
您提到的第二个错误似乎与您提供
std::vector作为第二个模板参数这一事实有关,而不是提供std::vector<int>的完全专业化。这是说它需要一个模板类,但您提供了一个类名。
标签: c++ templates generic-programming