Refactorización con C ++ 11

Dado el nuevo conjunto de herramientas proporcionado por c ++ a muchos programadores, con el objetivo de simplificar el código, la expresividad, la eficiencia, hojear su código antiguo y hacer ajustes (algunos sin sentido, otros exitosos) para lograr sus objetivos. Mientras tratamos de no perder demasiado tiempo en esas labores y simplemente hacer cambios no intrusivos y autocontenidos, ¿cuáles son las mejores prácticas?

Déjame tachar lo obvio:

Utilizarauto para ejecutar bucles basados ​​en iteradores:

for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite;     
++it);
// becomes
for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it);

UtilizarCorbata para asignaciones múltiples que solo producen filas de código de estilo C (¿Cómo asignar múltiples valores a una estructura a la vez? )

a = 1;
b = 2; 
c = 3;
d = 4; 
e = 5;
// becomes
std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, 5);

Para que una clase no sea heredable, simplemente declare que es "final" y elimine el código que logró tal comportamiento.http://www.parashift.com/c++-faq/final-classes.html

Use la palabra clave delete para ocultar explícitamente los constructores / destructores en lugar de declararlos privados (por ejemplo, código para crear objetos basados ​​en el montón, objetos no copiables, etc.)

Convierta los funtores triviales creados solo para facilitar la ejecución de un único algoritmo STL enlambda funciones (además de reducir el desorden de códigos, tendrá garantizadas las llamadas en línea)

Simplifique el envoltorio RAII de un objeto con solo usar unapuntero inteligente

Deshazte de bind1st, bind2nd y solo usaenlazar

Reemplace el código escrito a mano para los rasgos de tipo (Is_ptr_but_dont_call_for_const_ptrs <> y similares :)) con el código estándar proporcionado por<type_traits>

Deje de incluir los encabezados boost para la funcionalidad ahora implementada en STL (BOOST_STATIC_ASSERT vs static_assert)

Proporcionar semántica de movimiento a las clases (aunque esto no calificaría como un cambio sucio / rápido / fácil)

Utilizarnullptr donde sea posible, en lugar de la macro NULA y deshacerse del código que rellenó los contenedores de punteros con 0 en el tipo de objeto

std::vector<foo*> f(23);
for (std::size_t i(0); i < 23; ++i)
{ f[i] = static_cast<foo*>(0); }
// becomes
std::vector<foo*> f(23, nullptr);

Borrar la sintaxis de acceso a datos vectoriales

std::vector<int> vec;
&vec[0];    // access data as a C-style array
vec.data(); // new way of saying the above

Reemplace lanzar () connoexcept (Además de evitar la especificación de excepciones en desuso, obtiene algunos beneficios de velocidadhttp://channel9.msdn.com/Events/GoingNative/2013/An-Efective-Cpp11-14-Sampler @ 00.29.42)

void some_func() noexcept; // more  optimization options
void some_func() throw();  // fewer optimization options
void some_func() ;         // fewer optimization options

Reemplace el código en el que empujaría un temporizador en un contenedor y esperaba que el optimizador ocultara la copia, con un"emplace" función donde esté disponible, con el fin de reenviar perfectamente el argumento y construir directamente un objeto en un contenedor sin ningún tipo de temporal.

vecOfPoints.push_back(Point(x,y,z)); // so '03
vecOfPoints.emplace_back(x, y, z);   // no copy or move operations performed
ACTUALIZAR

La respuesta de Shafik Yaghmour. se le otorgó la recompensa por tener la mayor aceptación por parte del público.

La respuesta de R Sahu. fue mi aceptada, porque lacombinación De características que propone capta laespíritu de refactorización : hacer que el código sea más claro, claro, sencillo y elegante.

Respuestas a la pregunta(11)

Su respuesta a la pregunta