2011-01-13 12 views
29

Inicialmente pensé que son todos iguales, pero resultó ser incorrecto. Entonces, ¿alguien puede explicar brevemente las diferencias entre estos tres? Por ejemplo:¿Cuáles son las diferencias entre std, tr1 y boost (como espacios de nombres y/o bibliotecas)?

  1. std::bind (más nuevo, la próxima generación de C++)
  2. std::tr1::bind (edad, extensión de C++ std)
  3. boost::bind (biblioteca completamente separado)

o std::shared_ptr, std::tr1::shared_ptr y boost::shared_ptr, ... etc

Actualización

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).

+4

pregunta de cambio - agregue "vincular", la pregunta sugiere que desea diferencia entre bibliotecas en general – peenut

+0

@peenut, él * está * preguntando claramente sobre la diferencia general. –

+0

necesita aclarar. ¿De verdad crees que hay un 'boost :: vector' o' boost :: cout'? ¿Qué * realmente * quieres saber? –

Respuesta

28

1 - std::bind es el nombre estándar para ello. Este será el nombre que use para las bibliotecas compatibles con C++ 11. Lista de todos libraries in standardized C++.

2 - std::tr1::bind es C++ Technical Report 1 espacio de nombre. Entre C++ 03 y C++ 11 estaba el C++ Technical Report 1, 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 espacio de nombre std::tr1 se usó para diferenciar las bibliotecas en su estado de trabajo en progreso, en oposición a todo lo estandarizado en el espacio de nombres std.

3 - boost::bind es para bind en el espacio de nombre boost, si está utilizando la biblioteca 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 todos los libraries in Boost as of 1.52.0

La mayor parte de lo que estaba en TR1 se ha estandarizado y está en el C++ 11 std espacio de nombres, y C++ 11 contiene más bibliotecas que se menciona en TR1 que fueron adaptados a partir de construcciones de impulso, como el soporte roscado 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 los 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, seguirán siendo compatibles con el espacio de nombres std::tr1. Visual C++ 2010 movió lo que estaba anteriormente en std::tr1 en el espacio de nombres normal std, pero Visual C++ 2008 todavía usa std::tr1.

+1

@VJo, sí, pero no pretendamos que no va a ser C++ 1x: p – birryree

+4

va a ser C++ 0C – ybungalobill

+1

@ybungalobill +1 por hacerme reír. :) – birryree

2

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.

+1

Las definiciones se heredaron de boost pero la implementación del código no es así y encontré errores horribles en tr1 :: bind en 2009, donde ni siquiera le permitía pasar ref() correctamente. Mi sensación es que no pueden simplemente copiar código de refuerzo en implementaciones de STL y es probable que sea inferior ya que el código de refuerzo ha sido revisado por pares y probado durante un largo período de tiempo, y por lo tanto, personalmente, por elección, me quedaré con impulso. – CashCow

+0

@CashCow: gracias por su consejo. Pero ¿qué tal las bibliotecas std :: de VC++? ¿Son peores que las bibliotecas de impulso? Por ejemplo boost :: regex vs std :: regex? – Chan

9

Si desea utilizar unen (o cualquier otro para el caso), una buena característica es el cambio de nombre de espacio de nombres, aquí es un ejemplo:

namespace MyNamespace = boost; 

void DoSomething(void) 
{ 
    MyNamespace::bind(...); 
} 

Ahora, si cambia MyNamespace ser:

namespace MyNamespace = std::tr1; 

Lo siguiente usa std::tr1::bind.

namespace MyNamespace = std::tr1; 

void DoSomething(void) 
{ 
    MyNamespace::bind(...); 
} 

Debe, por supuesto, utilizar MyNamespace para los elementos que desee cambiar fácilmente su espacio de nombres en el futuro, si usted sabe que quiere std :: TR1 que debe administrarse directamente y nunca un alias.

+0

gracias por un truco genial! – Chan

5

Lo has entendido en tu pregunta. Podría copiar/pegar tu ejemplo y responder tu pregunta correctamente. Sólo dos cosas realmente se destacan como que necesitan 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 forma 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 plantilla de valor devuelto parece a menudo ser ignorado con std :: bind en msvc para que pueda obtener errores sobre la ausencia de 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.

Cuestiones relacionadas