No estoy seguro de que el título de la pregunta sea correcto. Aquí está el problema Estoy escribiendo una biblioteca que utiliza algunas características de la biblioteca C++ 11. Es evidente que no todas las implementaciones son compatibles con estas bibliotecas y, por lo tanto, existe el problema de la portabilidad. No importa qué biblioteca sea de interés aquí. Una solución es usar boost, que ya proporciona muchas bibliotecas C++ 11. Así que mi solución es definir una macro, digamos USE_CXX11
, y definir un nuevo espacio de nombres, por ejemplo internal
, e introducir nombres en este espacio de nombres interno que depende de las macros. Por ejemplo, decir que necesito usar un nombre foo
de una biblioteca de C++ <foo>
, que también está disponible en <boost/foo/foo.hpp>
. Lo que hago esC++ wrapper para boost/C++ 11
#ifdef USE_CXX11
#include <foo>
#else
#include <boost/foo/foo.hpp>
#endif
namespace internal {
#ifdef USE_CXX11
using std::foo;
#else
using boost::foo::foo;
#endif
}
Y en el resto de la biblioteca que sólo utilizan internal::foo
. El código de terceros que utiliza esta biblioteca puede definir la macro adecuada para indicar si tienen una implementación de C++ 11 en funcionamiento o si solo pueden usar boost. Y mi biblioteca recogerá el encabezado y el espacio de nombres correctos. Esto funciona hasta ahora. Espero haber explicado bien mi intención.
Pero las soluciones anteriores me parecen muy feas. ¿Hay alguna mejor práctica para este tipo de cosas? ¿O hay situaciones posibles de que este enfoque no funcione?
Salida ** ** Boost.TR1 –
Si está en alza, y hay que apoyar compiladores obsoletos, solo use el de Boost directamente. –
¿Por qué no usar boost? – fbafelipe