То, что вы хотите, это параметр шаблона шаблона:
template <template <typename> class CollectionType, class ItemType>
class Test
{
public:
CollectionType<ItemType> m_collection;
};
Здесь мы указали, что первый параметр шаблона, т.е. CollectionType
, является шаблоном типа. Следовательно, Test
может быть создан только с типом, который сам является шаблоном.
Однако, как указал @Binary Worrier в комментариях, это не будет работать с контейнерами STL, поскольку они имеют 2 шаблонных параметров: один для типа элементов, другой для типа распределителя используется для управления распределением памяти (значение по умолчанию).
Следовательно, вам нужно изменить первый параметр шаблона, чтобы он имел два параметра:
template <template <typename,typename> class CollectionType, class ItemType>
class Test
{
public:
CollectionType<ItemType> m_collection;
};
Но подождите, это тоже не сработает! Действительно, CollectionType
ожидает другого параметра, распределителя ... Итак, теперь у вас есть два решения:
1. Принудительно использовать определенный распределитель:
CollectionType<ItemType, std::allocator<ItemType> > m_collection
2. Добавьте параметр шаблона для распределителя в ваш класс:
template <template <typename,typename> class CollectionType,
class ItemType,
class Allocator = std::allocator<ItemType> >
class Test
{
public:
CollectionType<ItemType, Allocator> m_collection;
};
Итак, как вы видите, в итоге вы столкнулись с чем-то довольно сложным, которое, кажется, действительно искажено для работы с контейнерами STL ...
Мой совет: см. Ответ Грега Роджерса для лучшего подхода:)!