2010-08-09 7 views
18

me gustaría reducir algo de ruido visual en el código y se esconden detrás de un typedef shared_ptr así:¿Es un buen estilo para ocultar shared_ptr detrás de un typedef?

typedef boost::shared_ptr<SomeLongClass> SomeLongClassPtr; 

Así que esto:

void foo(const boost::shared_ptr<SomeLongClass>& a, 
     boost::shared_ptr<SomeLongClass>& b); 

se convierte en esto:

void foo(const SomeLongClassPtr& a, SomeLongClassPtr& b); 

Por otro lado, me preocupa que reduzca la claridad del código.

¿Cuál es un mejor estilo?

+0

Esto es una especie de duplicado de [¿Cuál es su convención para typedefing shared_ptr?] (Http://stackoverflow.com/questions/2717436/whats-your-convention-for-typedefing-shared-ptr) –

+0

@James, gracias, no pude encontrar esta pregunta yo mismo. –

+0

PleaseUseUnderScoresInsteadOfCapitalizingTheFirstLettersBecauseThisIsHardToRead – Inverse

Respuesta

12

Dado que std :: string es un typedef en sí mismo, creo que estás bien. Lo hare yo mismo.

Incluso Scott Meyers recomienda typedef para facilitar la lectura del código en casos como el suyo.


EDIT: efectiva C++, segunda edición, página 120, artículo 28, párrafo cuarto. "... proporcionar typedefs que eliminen la necesidad ..."

Más eficaz C++, 7ma impresión, Página 237, Ítem 31 Primer párrafo.

Más eficaz C++, 7ma impresión, página 238, artículo 31 Primer párrafo después del ejemplo de código.


En esencia, no se preocupe. :-)

+0

Me encantaría tener una referencia de Scott Meyers, pero mientras tanto, tomaré su palabra. –

+0

@Alex, ver la edición anterior. :-) – JustBoo

9

Usamos TypePtr typedefs en nuestro código para shared_ptr<Type> objects. También es útil tener un TypeConstPtr para shared_ptr<const Type>.

+2

Lo mismo. Si mejora la legibilidad y el mantenimiento, difícilmente puede ser algo malo. –

1

Puede nombrar el typedef 'SomeLongClassSharedPtr', que es tanto explícito como fácil de escribir.

Una consecuencia negativa de esta práctica es que algunas implementaciones de autocompletar (por ejemplo, en Eclipse CDT) no pueden seguirlo. Sin embargo, eso no me ha detenido personalmente de usarlo.

1

Me opongo a typedefs que ocultan si las cosas son punteros reales (o referencias), habiendo visto demasiado código C ilegible que hace esto. Pero al aplicar algo de casuística, supongo que shared_ptrs no son punteros reales, por lo que typedef está bien. Pero está perdiendo información: ya no puede decir con solo mirar la declaración de función (¡o definición!) Cuál es su semántica.

+0

Y déjame adivinar, estás absolutamente en contra de poner una "p" delante de él. ¡Eso suena a la notación húngara y ciertamente no podemos tener nada de eso! Estoy a favor del pragmatismo sobre la mentalidad de rebaño. Y no, no uso ni condono a HN. Sin embargo, pondré una "p" delante del nombre de un puntero. – JustBoo

+0

@JustBoo Nunca me han acusado de seguir al rebaño antes, pero supongo que es la primera vez para todo. Y sí uso un húngaro muy limitado: todas las variables de mis miembros tienen el prefijo 'm'. –

+0

@Neil: Bien, entonces. :-D Yo también. http://stackoverflow.com/questions/3461697/cstring-variable-name-prefix/3461766#3461766 junto con la "p" ocasional y eso es todo. – JustBoo

Cuestiones relacionadas