2010-02-10 18 views
2

J'ai une classe qui ressemble à ceci:C++ classe modèle utilisant conteneur STL et un typedef

#include <vector> 
#include "record.h" 
#include "sortcalls.h" 

template< 
    typename T, 
    template<typename , typename Allocator = std::allocator<T> > class Cont = std::vector> 
class Sort: public SortCall { 

Ce code fonctionne et je vous appelle comme ça d'autres classes:

Comparator c; // comparison functor 
Sort< Record, std::vector > s(c); 

Maintenant, je veux être en mesure de passer les conteneurs à un autre conteneur, disons une liste. Donc, je pensais qu'un typedef serait soigné. Il devrait être quelque chose comme

typedef std::vector<Record> container; // Default record container 

template< 
    typename T, 
    template< typename, typename container > // ??? 
class Sort: public SortCall { 
+1

Je ne suis pas sûr de comprendre; vous n'utilisez pas 'Sort' n'importe où. En outre, '_Alloc' est réservé au compilateur; vous devriez changer cela juste pour 'Allocator' ou quelque chose. – GManNickG

+1

Je ne suis pas sûr de comprendre pourquoi les paramètres du template doivent être aussi compliqués. Pourquoi pas 'template class Trier ...' avec 'Sort s'? – UncleBens

+0

@GMan thx. Changé. – mre

Répondre

5

Ne pas utiliser (Cont dans votre code) paramètres de modèle de modèle, ils sont fragiles et rigides. Utiliser un mécanisme de retirage si vous avez besoin (std :: allocateur est un exemple), mais vous ne le faites pas dans ce cas:

template<class T, class Cont=std::vector<T> > 
struct Sort { 
    typedef Cont container_type; // if you need to access it from outside the class 
    // similar to std::vector::value_type (which you might want to add here too) 
}; 

typedef Sort<int, std::list<int> > IntListSort; 

Comparer à std :: file d'attente et std :: pile, qui suivent également cette modèle.

+0

L'utilisation de cette conception sur des paramètres de modèle de gabarit est l'une de ces choses que beaucoup d'entre nous apprennent à la dure, avec beaucoup de strabisme à la norme et le grattage de la tête. +1 –

+0

Cela pourrait être la meilleure solution pour le développement futur. Vous obtenez mon vote. Bien que UncleBens a fourni la première solution de travail. Merci à tous! – mre

0

que vous avez dans votre exemple, vous devriez pouvoir utiliser « conteneur » directement après typename. Sa spécification de type sera développée lors de l'exécution du compilateur.

Essayez compiler ...

0

Je pense qu'il pourrait être plus facile si vous utilisez des caractères de type. Chaque conteneur en STL et boost a un numéro de type typedef, parmi eux value_type (consultez la référence http://www.cplusplus.com/reference/stl/vector/). Ainsi, votre code peut ressembler à:

template<class C> 
class sort { 
    typedef typename C::value_type value_type; // equivalent to T in your case. 
    // similarly you can get allocator, iterator, etc.