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:
std::bind
( plus récent, la prochaine génération de C++ )std::tr1::bind
( vieux, extension de C++ std )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 ).
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::bind
bind
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
.
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.
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é parstd::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.
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.