c++ - ¿Cuáles son las diferencias entre std, tr1 y boost(como espacios de nombres y/o bibliotecas)?
c++11 (4)
1 - std::bind
es el nombre estándar para esto. Este será el nombre que use para las bibliotecas compatibles con C ++ 11. Lista de todas las bibliotecas en C ++ estandarizado .
2 - std::tr1::bind
es el espacio de nombres del Informe técnico 1 de C ++. Entre C ++ 03 y C ++ 11 estaba el Informe técnico 1 de C ++ , que proponía bibliotecas y mejoras adicionales. La mayoría de estos ya existían en Boost en ese momento, y algunos de estos cambios de biblioteca se adoptaron en el estándar C ++ 11, como <regex>
y <functional>
(que contiene std::bind
). El std::tr1
nombres std::tr1
se usó para diferenciar las bibliotecas en su estado de trabajo en progreso, a diferencia de todo estandarizado en el std
nombres estándar.
3 - boost::bind
es para bind
en el espacio de nombres de boost
, si está utilizando la biblioteca de Boost . Boost abarca mucho más que lo que está en TR1 y lo que yo en la biblioteca estándar de C ++ 11. Lista de todas las bibliotecas en Boost desde 1.52.0
La mayor parte de lo que estaba en TR1 ha sido estandarizado y está en el std
nombres de C ++ 11, y C ++ 11 contiene más bibliotecas que las mencionadas en TR1 que fueron adaptadas de las construcciones de Boost, como el soporte de subprocesos definido en <thread>
.
Parte de lo que define qué puede usar y qué espacio de nombres puede usar ahora depende de su compilador. No recuerdo, pero creo que las implementaciones más recientes de GCC-g ++ han comenzado a usar espacios de nombres std
para las nuevas bibliotecas de C ++ 11, pero pueden requerir un indicador de compilación diferente para activar eso. Sin embargo, todavía admitirán el std::tr1
nombres std::tr1
. Visual C ++ 2010 movió lo que estaba anteriormente en std::tr1
en el std
nombres std
normal, pero Visual C ++ 2008 aún usa std::tr1
.
Inicialmente pensé que son todos iguales, pero resultó ser incorrecto. Entonces, ¿alguien puede explicar brevemente las diferencias entre estos tres? Por ejemplo:
-
std::bind
(el más nuevo, la próxima generación de C ++) -
std::tr1::bind
(antiguo, extensión de C ++ std) -
boost::bind
(biblioteca completamente separada)
o std::shared_ptr
, std::tr1::shared_ptr
, y boost::shared_ptr
, ... etc
Actualizar
bind
, shared_ptr
son ejemplos que ayudan a aclarar mi pregunta. Mi intención era entender las diferencias generales entre esos tres espacios de nombres. Hay varias bibliotecas que existen en los tres espacios de nombres, y aparentemente bind
es un ejemplo, así como shared_ptr
.
¿Con qué espacios de nombres debo quedarme? Personalmente prefiero la biblioteca de std::
ya que será el próximo estándar de C ++ (C ++ 0x).
Casi lo tienes en tu pregunta allí. Podría copiar / pegar tu ejemplo y responder tu pregunta correctamente. Solo dos cosas realmente se destacan por necesitar expansión:
1) Exactamente CÓMO y por qué std :: se expande por tr1. TR1 es "Informe técnico 1" y es el primer conjunto oficial de expansiones de la biblioteca propuesto al comité de estándares por uno de sus subgrupos. Por lo tanto, es un poco más que una extensión del estándar.
2) boost :: bind en realidad se comporta de manera diferente que std :: bind, al menos en algunos sistemas. No sé si es estándar en no pero en MSVC expresiones lambda y std :: bind se comportan muy mal entre sí. Quizás otras formas también, no lo recuerdo ya que hice una política para usar boost :: bind en lugar de std :: bind. El parámetro de la plantilla de valor de retorno parece a menudo ser ignorado con std :: bind en msvc para que pueda obtener errores acerca de que no haya return_value<f>::type
(o lo que sea) cuando lo haya especificado con std::bind<type>(...)
. Nunca me molesté en descubrir la diferencia exacta en el comportamiento ya que boost :: bind ya había entrado en nuestro vocabulario habitual y sabíamos cómo usarlo.
No debería hacer una gran diferencia ya que grandes partes del próximo estándar de C ++ en realidad fueron heredadas de Boost. Entonces, si tiene std::bind
y no tiene que ser compatible con otros compiladores, simplemente úselo. boost::bind
es bueno si quieres ser independiente del compilador. Creo que std::tr1::bind
no tiene ninguna ventaja sobre los otros dos si están disponibles: no es estándar con respecto a C ++ 03 y C ++ 0x.
Si desea utilizar bind (o cualquier otro para el asunto), una buena característica es el cambio de nombre del espacio de nombres, aquí hay un ejemplo:
namespace MyNamespace = boost;
void DoSomething(void)
{
MyNamespace::bind( ... );
}
Ahora, si cambia MyNamespace para ser:
namespace MyNamespace = std::tr1;
Los siguientes usos std::tr1::bind
.
namespace MyNamespace = std::tr1;
void DoSomething(void)
{
MyNamespace::bind( ... );
}
Debería, por supuesto, usar MyNamespace para los elementos que desea cambiar fácilmente su espacio de nombres en el futuro, si sabe que quiere std :: tr1 debe usarlo directamente y nunca un alias.