2010-03-15 21 views
12

Estoy aprendiendo c++0x, al menos las partes admitidas por Visual C++ Express 2010 Beta. Esta es una pregunta sobre el estilo en lugar de cómo funciona. Quizás es demasiado pronto para que el estilo y las buenas prácticas hayan evolucionado aún para un estándar que aún no se ha lanzado aún ...Función return type type

En c++0x puede definir el tipo de retorno de un método usando -> escribir al final del función en lugar de poner el tipo al inicio. Creo que este cambio en la sintaxis es necesario debido a lambdas y algunos casos de uso de la nueva palabra clave decltype, pero puede usarlo en cualquier lugar que yo sepa.

// Old style 
int add1(int a, int b) 
{ 
return a + b; 
} 

// New style return type 
auto add2(int a, int b) -> int 
{ 
return a + b; 
} 

Mi pregunta realmente a continuación, se da que tendrán que ser definidos en la nueva forma que se considera un buen estilo para definir todas las funciones de este modo para mantener la coherencia de algunas funciones? ¿O debería limitarme a usarlo solo cuando sea necesario?

+5

Navaja de Occam: Dadas dos construcciones de código equivalente, la más simple es la mejor. –

+0

Btw, Visual Studio 2010 RC1 ya se ha lanzado – abatishchev

+0

Sí, es RC1 (express) que estoy usando. Me equivoqué con la versión en mi publicación – jcoder

Respuesta

18

No sea consistente con el estilo solo por ser consistente. El código debe ser legible, es decir, comprensible, esa es la única medida real. Agregar desorden al 95% de los métodos para ser consistente con el otro 5%, bueno, eso no me suena bien.

+0

Aceptamos esta respuesta ya que resume la discusión y tiene la mayoría de los votos de todos modos. Las otras respuestas son buenas, gracias – jcoder

2

Me parece que cambiaría el hábito de toda la vida de muchos programadores de C++ (y otros similares a C).

Si utilizó ese estilo para cada función, entonces podría ser el único que lo hace :-)

5

Hay una enorme base de código que utiliza el 'viejo'/normas actuales. Apostaría que va a ser así durante mucho tiempo. El problema de la coherencia es doble: ¿con quién vas a ser coherente, los pocos códigos que requerirán la nueva sintaxis o todos los códigos existentes?

Mantendré la sintaxis anterior cuando no se requiera la nueva, pero solo el tiempo dirá qué se convierte en el uso común.

También tenga en cuenta que la nueva sintaxis es todavía un poco raro: se declara el tipo de retorno como auto y luego definir lo que significa auto al final de la declaración de la firma ... No se siente natural (incluso si no lo hace compárelo con su propia experiencia)

2

Voy a adivinar que el estándar actual ganará, como lo ha hecho hasta ahora con cualquier otro cambio propuesto en la definición. Se ha ampliado, sin duda, pero la semántica esencial de C++ es tan profunda que no creo que valga la pena cambiarla. Han influido en tantos idiomas y guías de estilo es ridículo.

En cuanto a su pregunta, trataría de separar el código en módulos para dejar en claro dónde está utilizando el estilo antiguo frente al nuevo estilo. Donde los dos se mezclan, me aseguraré y delinearé tanto como sea posible. Agrúpelos juntos, etc.

[opinión personal] Encuentro realmente discordante surfear a través de los archivos y ver el estilo cambiar de un lado a otro, o cambiar radicalmente. Simplemente me pregunto qué más está al acecho allí [/ opinión personal]

5

Personalmente, lo usaría cuando sea necesario. Al igual que this-> solo es necesario cuando se accede a miembros de una plantilla de clase base (o cuando están ocultos), por lo que auto fn() -> type solo es necesario cuando no se puede determinar el tipo de retorno antes de que el resto de la firma de función esté visible.

Usar esta regla de oro probablemente ayudará a la mayoría de los lectores de códigos, que podrían pensar "¿por qué el autor pensó que necesitamos escribir la declaración de esta manera?" de otra manera.

1

Buenos cambios de estilo - si no me crees, mira lo que era un buen estilo en 98 y lo que es ahora - y es difícil saber qué se considerará un buen estilo y por qué. En mi humilde opinión, actualmente todo lo relacionado con C++ 0X es experimental y el estilo de calificación bueno o malo simplemente no se aplica todavía.

5

No creo que sea necesario usarlo para las funciones normales. Tiene usos especiales, lo que le permite hacer fácilmente lo que podría haber sido bastante incómodo antes. Por ejemplo:

template <class Container, class T> 
auto find(Container& c, const T& t) -> decltype(c.begin()); 

Aquí no sabemos si los contenedores es const o no, por lo tanto, si el tipo de retorno sería Container::iterator o Container::const_iterator (se puede determinar a partir de qué begin() regresarían).