我试图围绕模板模板如何工作来实现类似的功能,如下所示。
考虑两个类(在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'
我一直在寻找答案,但要弄清楚要问的问题甚至很难。模板模板很难。
答案 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
它更加灵活。