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> в InnerCont в некоторых случаях - как это:

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

Можно ли использовать частичную специализацию параметр шаблона шаблона для этого случая?
Или как архивировать с минимальной головной болью ..

ответ

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; 
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; 
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; }; 
Смежные вопросы