2009-11-10 11 views
5

Si quiero crear un puntero inteligente a struct Yo que:shared_ptr con plantillas

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

Por lo tanto, puedo escribir lo siguiente:

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

Pero, si tengo una estructura de plantilla así:

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

Y quiero escribir lo siguiente:

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

Entonces, ¿cómo debo declarar el B_Ptr?

Respuesta

6

Si está interesado en un tipo de plantilla fija para B, entonces respaldo mi apoyo a la respuesta de xtofl. Si está interesado más tarde en especificar el argumento de la plantilla B, C++ no le permite hacer esto (aunque se cambiará en C++ 0x). Normalmente lo que estás buscando es este tipo de solución: (. Gracias a las mejoras para UncleBens)

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

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

+1

Esa es una buena manera de complicar más una respuesta simple. –

+0

@Martin: ¿Cómo es eso? Su redacción de la pregunta es tan vaga que no estoy seguro de que esté buscando un tipo fijo, y mi respuesta es una solución razonable en el caso de que no lo sea. – fbrereto

+2

O quizás: 'plantilla struct T_Ptr {typedef boost :: shared_ptr > type; }; T_Ptr :: tipo x; ' – UncleBens

6

Eso sería

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

¿Está seguro de que 'B *' es implícitamente convertible a 'shared_ptr >'? – sellibitze

+1

Error clásico shared_ptr. Debería ser B_ptr p (nuevo B ). –

+0

@Dan: ¿por qué? También puedo escribir 'int i = 0;' como 'int i (0);'. – xtofl

4

Lo que se quiere sin embargo, no es posible en C++. ¿Quieres typedefs "plantilla", que será conocido en C++ 0x como "plantillas de declaración de alias":

template<typename T> 
struct A {}; 

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

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

Creo que se puede hacer algo similar en C++ 98 con una macro si realmente quiere.

2

Otro enfoque útil es definir el tipo puntero dentro de la plantilla de clase B:

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

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