有这段代码:
template<typename T, template<typename, typename> class OuterCont, template<typename, typename> class InnerCont, class Alloc=std::allocator<T>>
class ContProxy {
OuterCont<T, InnerCont<T, Alloc>> _container;
};
typedef ContProxy<int, std::vector, std::list> IntCont;
但在某些情况下需要使用T*
代替std::list<T>
作为InnerCont
- 就像这样:
template<typename T, template<typename, typename> class OuterCont, T*, class Alloc=std::allocator<T>>
class ContProxy {
OuterCont<T, T*> _container;
};
对于这种情况,是否可以使用'模板模板'参数的部分特化? 或者如何以最小的头痛归档它。
答案 0 :(得分:3)
在类型上简单模板通常更容易。您无法使用模板模板捕获每种情况 - 如果有人想要使用具有六个模板参数的容器,该怎么办?所以尝试这样的事情:
template <typename T, typename C>
struct ContProxy
{
typedef C container_type;
typedef typename C::second_type second_type;
container_type container_;
};
ContProxy<int, MyContainer<int, std::list<int>> p;
答案 1 :(得分:0)
我也会选择kerrek的解决方案,但除此之外,我能想到的最好的事情就是这个。
问题是InnerCont在基本模板中被声明为模板类型,因此您不能再将其专门用于原始指针。因此,您可以创建一个表示指针的虚拟模板并使用它。
template<typename,typename> class PtrInnerCont; //just a dummy template that does nothing
template<typename T, template<typename, typename> class OuterCont, template<typename, typename> class InnerCont, class Alloc=std::allocator<T>>
class ContProxy {
OuterCont<T, PtrInnerCont<T, Alloc>> _container;
};
typedef ContProxy<int, std::vector, std::list> IntCont;
template<typename T, template<typename, typename> class OuterCont, class Alloc>
class ContProxy<T, OuterCont, PtrInnerCont, Alloc> {
OuterCont<T, T*> _container;
};
typedef ContProxy<int, std::vector, PtrInnerCont> MyCont;
答案 2 :(得分:0)
你实际上不能真正做你正在做的事情。不是以标准的方式。 C ++容器不使用相同的模板参数。
做同样的事情:
template< typename T,
template<typename, typename> class OuterCont,
template<typename, typename> class InnerCont,
class Alloc=std::allocator<T>>
class ContProxy {
typename OuterCont<T, typename InnerCont<T, Alloc>::type>::type _container;
};
然后你可以像这样创建不同的容器生成器:
template < typename T, typename A = std::allocator<T> >
struct vector_gen { typedef std::vector<T,A> type; };
或指针一:
template < typename T, typename Ignored >
struct pointer_gen { typedef T* type; };