2009-11-10 6 views
5

Si je veux créer un pointeur intelligent struct-je faire:shared_ptr avec des modèles

struct A 
    { 
     int value; 
    }; 
    typedef boost::shared_ptr<A> A_Ptr; 

Alors, je peux écrire ce qui suit:

A_Ptr pA0(new A); 
    pA0->value = 123; 

Mais, si j'ai un struct modèle comme ça:

template<typename T> 
    struct B 
    { 
     T value; 
    }; 

Et je veux écrire ce qui suit:

B_Ptr<char> pB0(new B<char>); 
    pB0->value = 'w'; 

Alors, Comment dois-je déclarer le B_Ptr?

Répondre

6

Si vous êtes intéressé par un type de modèle fixe pour B, alors je jette mon soutien derrière la réponse d'xtofl. Si vous souhaitez spécifier plus tard l'argument de modèle de B, C++ ne vous permet pas de le faire (bien qu'il soit modifié en C++ 0x). En général ce que vous cherchez est ce genre de solution: (. Merci à Unclebens pour les améliorations)

template <typename T> 
struct B_Ptr 
{ 
    typedef boost::shared_ptr< B<T> > type; 
}; 

B_Ptr<char>::type pB0 = ...; 

+1

C'est une bonne façon de trop compliquer une réponse simple. –

+0

@Martin: Comment ça? Sa formulation de la question est assez vague pour que je ne sois pas convaincu qu'il cherchait un type fixe, et ma réponse est une solution raisonnable dans le cas contraire. – fbrereto

+2

Ou peut-être: 'template structure T_Ptr {typedef boost :: shared_ptr > type; } T_Ptr :: type x; ' – UncleBens

6

Ce serait

typedef shared_ptr< B<char> > B_Ptr; 
B_Ptr p(new B<char>); 
p->value = 'w'; 
+1

Êtes-vous sûr que 'B *' est implicitement convertible en 'shared_ptr >'? – sellibitze

+1

Erreur shared_ptr classique. Ce devrait être B_ptr p (nouveau B ). –

+0

@Dan: pourquoi? Je peux aussi bien écrire 'int i = 0;' que 'int i (0);'. – xtofl

4

Ce que vous voulez est pas encore possible en C++. Vous voulez « typedefs de modèle » qui sera connu en C++ 0x comme « modèles de déclaration d'alias »:

template<typename T> 
struct A {}; 

template<typename T> 
using APtr = boost::shared_ptr<A<T>>; // <-- C++0x 

int main() { 
    APtr<int> foo; 
} 

Je suppose que vous pourriez faire quelque chose de similaire en C++ 98 avec une macro si vous voulez vraiment.

2

Une autre approche intéressante consiste à définir le type de pointeur à l'intérieur modèle de classe B:

template<typename T> struct B 
{ 
    typedef boost::shared_ptr< B<T> > SPtr; 
    T value; 
}; 

B<int>::SPtr p(new B<int>());