2009-04-04 8 views
15

La serie de preguntas sobre BOOST_FOREACH me lleva a preguntar a los usuarios de la biblioteca Boost qué están haciendo (si es que lo hacen) para preparar su código para la portabilidad del nuevo estándar C++ propuesto (también conocido como C++ 0x) Por ejemplo, se escribe código como este si utiliza shared_ptr:Preparándose para el próximo estándar C++

#ifdef CPPOX 
#include <memory> 
#else 
#include "boost/shared_ptr.hpp" 
#endif 

También existe el problema de espacio de nombres - en el futuro, shared_ptr será parte de la std, espacio de nombres - ¿cómo lidiar con eso?

Me interesan estas preguntas porque he decidido dar un paso al frente y comenzar a aprender a impulsar con seriedad, y me gustaría utilizar las mejores prácticas en mi código.

No es exactamente una avalancha de respuestas: ¿esto significa que no es un problema? De todos modos, gracias a los que respondieron; ¡Estoy aceptando la respuesta de jalfs porque me gusta que me aconsejen que no haga nada!

+0

¿Quiere decir C++ 09, verdad? Tiene que salir en 8 meses :) –

+1

@Robert: ¿Quieres decir que está programado para salir en 8 meses? No está cerca de la final. Pero sí, creo que muchas personas se sentirán decepcionadas si no cumplen con el plazo de 09. (Por cierto, realmente me está comenzando a gustar el nombre C++ 0x. ¿No podrían quedarse con eso?;) – jalf

+0

Bueno, creo que deberían llamarlo C++ 1x y renunciar a 0x, hay queda mucho trabajo, y el estado actual es un desastre, pero si no se están moviendo, la fecha límite debe salir en 8 meses :) –

Respuesta

14

La respuesta simple es "no hacer nada". Boost no va a eliminar las bibliotecas que fueron adoptadas en 0x. Así que boost :: shared_ptr seguirá existiendo. Por lo tanto, no es necesario que haga nada para mantener la portabilidad.

Por supuesto, una vez que 0x está aquí, una gran cantidad de código se puede simplificar, limpiar y optimizar, pero como todavía no está aquí, ese trabajo realmente no puede comenzar. Todo lo que puede hacer es asegurarse de que su código se compilará cuando 0x llegue ... y así debería ser. Boost no va a eliminar la mitad de sus bibliotecas. (No estoy adivinando. Han indicado esto en su lista de correo antes)

(y si quiere cambiar al estándar shared_ptr, diría que es probablemente más fácil hacer una simple búsqueda/reemplazar cuando llega el momento. Reemplazar #include <boost/shared_ptr.hpp> con #include <memory> y boost::shared_ptr con std::shared_ptr)

o, por supuesto, sólo puede decidir sobre el proyecto que se va a seguir usando Boost de shared_ptr. El hecho de que se haya agregado a la biblioteca estándar no significa que tenga para usarlo, después de todo.

+0

Hacer nada es, por supuesto, una opción atractiva, ¿pero viable? No me gustaría terminar con dos implementaciones de shared_ptr en mi base de código, una potencial pesadilla de depuración y soporte. –

+0

@Neil Butterworth: Estás insinuando una colisión en el espacio de nombres. Esto puede ser evitado. – dirkgently

+0

Revisa mi edición. Creo que la forma más sencilla de cambiar las implementaciones es una simple búsqueda/reemplazo, una vez que se actualiza a 0x. Hasta entonces, evitaría el desorden extra de #ifdefs y apoyaría a ambos. – jalf

1

No, no, hasta el momento, teniendo en cuenta los siguientes hechos:

  • soporte para C++ 0x no es sin embargo hasta la marca a través de las distintas plataformas (necesitamos) y
  • que es todavía a ser declarado un estándar oficial

pero sí, hacemos uso de Boost, cuando sea necesario (pero, por supuesto, sólo después de un lanzamiento ha pasado por una fase de saneamiento lo usamos) justo como cualquier otra lib de terceros rary que usamos. Además, usamos el formulario de origen según sea necesario.

Sin embargo, hay un esfuerzo hacia una adopción más estricta de los principios de conducción en la fase de diseño del producto (por ejemplo, move-ctor, etc.).

Definitivamente va a haber algo de trabajo cuando C++ 0x se estandarice; pero eso también requerirá que pasemos a algunos de los compiladores más nuevos (vc10?) y pasar a un nuevo compilador es siempre una tarea por sí mismo.

2

No será necesario hacer nada debido a los espacios de nombres. Si desea utilizar la implementación de boost, seguirá usando el nombre del boost.

No creo que se aventuraran a romper la compatibilidad de una manera tan grande con una versión anterior.

Ver mi anterior pregunta similar aquí: what will happen with the overlapping portion of boost once C++0x becomes mainstream?

pero claro si el uso de espacio de nombres mucho en su código que puede tener algunas definiciones que se solapan. Tendrá que volver a especificar el espacio de nombres explícitamente en cada uso.

+0

Bueno, en cualquier caso, el código no se compilará por lo que no habrá ningún problema;) –

1

Es posible que en realidad siempre prefiera usar la versión de Boost durante mucho tiempo. Especialmente si necesita compilar en múltiples plataformas.

Las bibliotecas Boost son portados y probado en múltiples plataformas y se comportan de la misma allí (la mayor parte del tiempo.)

Las primeras implementaciones de proveedores de la nueva C++ bibliotecas pueden contener errores menores y las diferencias de rendimiento al igual que lo fue un desastre cuando se agregaron STL y el espacio de nombres estándar.

2

La mejor manera de usar partes compartidas entre C++ 0x y Boost es usar Boost.TR1, es decir; la implementación si el Informe Técnico ya fue aceptado. Boost.TR1 utilizará la implementación proporcionada por el compilador cuando esté disponible, y la proporcionada por Boost de lo contrario. Este fue el objetivo principal de Boost.TR1

"La biblioteca TR1 proporciona una implementación del Informe técnico de C++ sobre las extensiones de biblioteca estándar. Esta biblioteca no implementa los componentes TR1, sino que es una envoltura delgada que incluirá su estándar la implementación TR1 de la biblioteca (si tiene una), de lo contrario incluirá los equivalentes de Boost Library e importarlos al espacio de nombres std :: tr1. "

Cuestiones relacionadas