Quelles sont les différences entre std, tr1 et boost (comme espaces de noms et/ou bibliothèques)?

j'ai d'abord pensé qu'ils sont tous les mêmes, mais il s'est avéré être faux. Est-ce que quelqu'un peut expliquer brièvement les différences entre les trois? Par exemple:

  1. std::bind ( plus récent, la prochaine génération de C++ )
  2. std::tr1::bind ( vieux, extension de C++ std )
  3. boost::bind ( complètement séparé de la bibliothèque )

ou std::shared_ptr,std::tr1::shared_ptr et boost::shared_ptr, ...etc

mise à Jour

bind,shared_ptr sont des exemples qui aident à clarifier ma question. Mon intention était de comprendre les différences entre ces trois espaces de noms. Il existe plusieurs bibliothèques qui existent dans les trois espaces de noms, et apparemment bind en est un exemple, ainsi que shared_ptr.

avec quels namespaces dois-je m'en tenir? Personnellement, je préfère la bibliothèque de std:: puisqu'il sera le prochain standard de C++ ( C++0x ).

31
demandé sur Yu Hao 2011-01-13 20:07:38

4 réponses

1 -std::bind est le nom standard. Ce sera le nom que vous utiliserez pour les bibliothèques conformes à C++11. Liste de tous les bibliothèques standard C++.

2 -std::tr1::bind est le C++, Rapport Technique 1 espace de noms. Entre C++03 et C++11 Il y avait le C++ Rapport Technique 1, qui proposaient des bibliothèques supplémentaires et des améliorations. La plupart de ces changements existaient déjà dans Boost à l'époque, et certains de ces changements ont été adoptés. dans le standard C++11, comme <regex> et <functional> (qui contient std::bind). std::tr1 namespace a été utilisé pour différencier les bibliothèques dans leur état de travail en cours, par opposition à tout standardisé dans le std espace de noms.

3 -boost::bindbind dans le boost namespace, si vous utilisez le Boost bibliothèque. Boost englobe beaucoup plus que ce qui est dans TR1 et ce que je dans la bibliothèque std DE C++11. Liste de tous les bibliothèques en Boost à partir de 1.52.0

la plupart de ce qui était dans TR1 a été standardisé et est dans le C++11 std espace de noms, et de C++11 contient plus les bibliothèques que mentionné dans TR1 qui ont été adaptés à partir de Stimuler les constructions, comme le filetage de support défini dans <thread>.

une partie de ce qui définit ce que vous pouvez utiliser et quel namespace vous pouvez utiliser dépend maintenant de votre compilateur. Je ne me souviens pas, mais je pense que les plus récentes implémentations GCC-g++ ont commencé en utilisant std les espaces de noms pour la nouvelle C++11 bibliothèques, mais peut nécessiter un compilateur différent drapeau de l'activer. Ils soutiendront toujours le std::tr1 espace de noms. Visual C++ 2010 déplace ce qui était auparavant dans std::tr1 dans la normale std espace de noms, mais Visual C++ 2008 encore utilisé std::tr1.

28
répondu wkl 2012-12-31 19:25:02

si vous voulez utiliser bind (ou n'importe quel autre pour le sujet), une fonctionnalité de nice est namespace renommer, voici un exemple:

namespace MyNamespace = boost;

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

maintenant, si vous changez MyNamespace pour être:

namespace MyNamespace = std::tr1;

Les utilisations suivantes std::tr1::bind.

namespace MyNamespace = std::tr1;

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

vous devriez, bien sûr, utiliser MyNamespace pour les éléments que vous voulez facilement changer son namespace dans le futur, si vous savez que vous voulez std::tr1 vous devriez l'utiliser directement et jamais un alias.

10
répondu MatiasFG 2015-05-21 18:59:26

vous l'avez à peu près dans votre question là. Je pourrais simplement copier / coller votre exemple et répondre à votre question correctement. Il n'y a que deux choses qui ressortent comme nécessitant une expansion:

1) exactement comment et pourquoi std:: est élargi par tr1. TR1 est le "rapport technique 1" et est le premier ensemble officiel d'agrandissement de bibliothèque proposé au Comité de normes par l'un de ses sous-groupes. C'est donc un peu plus qu'une extension de la norme.

return_value<f>::type (ou autre) lorsque vous avez spécifié par std::bind<type>(...). Jamais pris la peine de comprendre l'exacte différence de comportement depuis boost::bind avait déjà fait dans notre vocabulaire, et nous savions comment l'utiliser.

5
répondu Crazy Eddie 2011-01-13 17:45:55

cela ne devrait pas faire une grande différence puisque de grandes parties du prochain standard C++ étaient en fait héritées de Boost. Donc, si vous avez std::bind et n'ont pas à être compatible avec d'autres compilateurs, juste l'utiliser.boost::bind c'est bien, si vous voulez être compilateur indépendant. Je pense std::tr1::bind n'a aucun avantage par rapport aux deux autres si elles sont disponibles: il n'est pas standard en C++03 et C++0x.

2
répondu Philipp 2011-01-13 17:12:23