2011-06-16 20 views
13

Me encanta usar punteros inteligentes, y he visto un poco de código que hace un buen uso de typedef s hacen que sean más bonitos. Por ejemplo:punteros inteligentes, typedefs y declaraciones directas

struct A { 
    typedef boost::shared_ptr<A> pointer; 
}; 

me permite escribir: A::pointer a(new A);

Pero he con un obstáculo de menor importancia en mi typedef felicidad: - /, declaraciones adelantadas ...

así que imagina este escenario:

struct B; 
struct A { 
    boost::shared_ptr<B> b_; 
}; 

struct B { 
    boost::shared_ptr<A> a_; 
}; 

funciona bastante bien, pero me encantaría limpiar eso un poco. Por desgracia, esto es no funciona

struct B; 
struct A { 
    typedef boost::shared_ptr<A> pointer; 
    B::pointer b_; // <-- error here 
}; 

struct B { 
    typedef boost::shared_ptr<B> pointer; 
    A::pointer a_; 
}; 

entiendo por qué, en ese punto en el archivo, el compilador no tiene información de que B, de hecho, tiene un tipo en ella el nombre pointer.

Tengo la sensación de que estoy atascado usando el viejo enfoque al menos para algunas cosas, pero me encantaría escuchar algunas ideas inteligentes.

Respuesta

3

puedo pensar en dos enfoques:

  • Se puede crear una plantilla ptr_for y utilizarlo algo como esto ptr_for<B>::type b_ptr_;
  • Se podría pimpl las dos estructuras (Sé que esto probablemente no es lo que usted' Estoy buscando) para que las definiciones de las implementaciones puedan aparecer después de las definiciones de A y B.
4

Si desea compartir typedefs es probable que desee utilizar espacios de nombres para la declaración de ellos:

struct A; 
struct B; 

namespace Aimpl { 
    typedef boost::shared_ptr<A> pointer; 
} 

namespace Bimpl { 
    typedef boost::shared_ptr<B> pointer; 
} 

struct A { 
    Bimpl::pointer b_; 
}; 

struct B { 
    Aimpl::pointer a_; 
}; 
6

que el uso de typedef no lo hace prettier- es inútil. Puede hacer que shared_ptr sea un tipo incompleto, así que solo use shared_ptr<B>.

+0

De acuerdo, solo deje un comentario que el resto del código debe usar B :: puntero, ya que los tipos serán equivalentes – totowtwo

Cuestiones relacionadas