Ce que vous voulez, c'est un paramètre de modèle :
template <template <typename> class CollectionType, class ItemType>
class Test
{
public:
CollectionType<ItemType> m_collection;
};
Ce que nous avons fait ici, c'est spécifier que le premier paramètre du modèle, c'est-à-dire CollectionType
est un modèle de type. Par conséquent, Test
ne peut être instancié qu'avec un type qui est lui-même un modèle.
Cependant, comme @Binary Worrier l'a souligné dans les commentaires, cela ne fonctionnera pas avec les conteneurs STL puisqu'ils ont 2 paramètres de modèle : l'un pour le type d'éléments, l'autre pour le type d'allocateur utilisé pour gérer l'allocation de stockage (qui a une valeur par défaut).
Par conséquent, vous devez modifier le premier paramètre du modèle pour qu'il ait deux paramètres :
template <template <typename,typename> class CollectionType, class ItemType>
class Test
{
public:
CollectionType<ItemType> m_collection;
};
Mais attendez, ça ne marche pas non plus ! En effet, CollectionType
attend un autre paramètre, l'allocateur... Vous avez donc maintenant deux solutions :
1 . Imposer l'utilisation d'un allocateur particulier :
CollectionType<ItemType, std::allocator<ItemType> > m_collection
2 . Ajoutez un paramètre de modèle pour l'allocateur dans votre classe :
template <template <typename,typename> class CollectionType,
class ItemType,
class Allocator = std::allocator<ItemType> >
class Test
{
public:
CollectionType<ItemType, Allocator> m_collection;
};
Comme vous le voyez, on se retrouve avec quelque chose d'assez compliqué, qui semble vraiment tordu pour traiter les conteneurs STL...
Mon conseil : consultez la réponse de Greg Rogers pour une meilleure approche :) !