1

有这个代码:

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>as - 像这样:InnerCont

template<typename T, template<typename, typename> class OuterCont, T*, class Alloc=std::allocator<T>>
class ContProxy { 
    OuterCont<T, T*> _container;
};

在这种情况下是否可以使用“模板模板”参数的部分专业化?
或者如何以最小的头痛存档它..

4

3 回答 3

3

简单地在type上进行模板化通常更容易。您无法使用模板模板真正捕捉所有情况——如果有人想使用具有六个模板参数的容器怎么办?所以尝试这样的事情:

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;
于 2012-05-10T05:34:16.097 回答
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;
于 2012-05-10T05:45:51.833 回答
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; };
于 2012-05-10T06:08:14.913 回答