====Windows==== ===Compilation=== git clone https://github.com/boostorg/boost.git git checkout boost-1.69.0 --recurse-submodules # C'est celui dans le dossier boost pas boost\tools\build bootstrap.bat b2 -j4 toolset=msvc-14.0 address-model=64 architecture=x86 threading=multi --build-type=complete variant=debug,release install --prefix=boost.install Compilation pour Visual Studio 2015 et pour des programmes en 64 bits (''address-model''). ''architecture'' vaut ''x86'' que ce soit pour ''address-model'' à 32 ou 64. Il n'y a pas ''link'' ni ''runtime-link'' de défini. Les deux versions ''static'' et ''shared'' seront compilés. On génère simultanément la version de ''release'' et ''debug''. ===Nommage de la dll=== ''-mt'', ''-gd'', ... voir [[https://www.boost.org/doc/libs/1_69_0/more/getting_started/windows.html]] ====boost::asio::execution_context==== L'exécuteur a les caractéristiques suivantes : * Fonctionnement entre thread, pas entre application via TCP, * Toujours en fonctionnement. En attente s'il n'a plus de travail à faire. {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/boost/executor/executor.h}} {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/boost/executor/executor.cpp}} {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/boost/executor/main.cpp}} ====boost::algorithm==== ===boost::algorithm::join et boost::adaptors::transformed=== #include #include #include #include struct Data { std::string name; std::string version; }; int main() { std::vector v{ {"Name1", "Version 1"}, {"Name2", "Version 2"} }; std::cout << boost::algorithm::join( v | boost::adaptors::transformed( [](const Data& firmware) { return firmware.name + " / " + firmware.version; } ), ", ") << std::endl; return 0; } ====Migrer de boost vers std==== ===Pointeur intelligent=== Aucune différence entre : * ''std::shared_ptr'' et ''boost::shared_ptr'', * ''std::unique_ptr'' et ''boost::unique_ptr'', * ''std::weak_ptr'' et ''boost::weak_ptr'', * ''std::make_shared'' et ''boost::make_shared'', * ''std::enable_shared_from_this'' et ''boost::enable_shared_from_this''. ''shared_ptr'', ''make_shared'' et ''enable_shared_from_this'' doivent tous venir de la même libraire. L'un en version ''std'' et l'autre en version ''boost'' sont incompatibles. * boost::ref et std::ref. ===assign=== Utiliser list_initializer. //const std::list primes = boost::assign::list_of(2)(3)(5)(7)(11); const std::list primes {2, 3, 5, 7, 11}; ===foreach=== short array_short[] = { 1, 2, 3 }; BOOST_FOREACH( short & i, array_short ) ++i; short array_short[] = { 1, 2, 3 }; for (short & i : array_short) ++i; Et avec des containers multi valeurs : std::map m; int key, value; BOOST_FOREACH(boost::tie(key, value), m) { // do something with key and value here } std::map m; int key, value; // Ici, key sera en lecture seule (implicite à la structure de std::map) et value sera accessible en écriture. // En cas de présente / absence explicite de const, cela s'applique obligatoirement à toutes les variables. for(auto & [key, value] : m) { // do something with key and value here } ===optional=== Il ne devrait pas y avoir de problèmes. Il faut noter que ''std'' ne supporte pas les références : ''std::optional''. ''boost::none'' devient ''std::nullopt''. ===regex=== Cette fonctionnalité était très peu utilisée. boost::regex_search(name, whatpath, expmatchIndexPath, boost::match_default); // std::regex_search ne supporte pas le 4ème paramètre. std::regex_search(name, whatpath, expmatchIndexPath); Sinon, ''boost::cmatch'' et ''boost::regex'' sont identiques à ''std::cmatch'' et ''std::regex''. ===variant=== boost::variant v = 5; double d = boost::get(v); // Génère une exception double *d = boost::get(&v); // Renvoi nullptr devient std::variant v = 5; double d = std::get(v); // Génère une exception double *d = std::get_if(&v); // Renvoi nullptr ''boost::apply_visitor'' devient ''std::visit''. Attention, ''boost::variant'' est accepté mais pas ''std::variant''. Dans tous les cas, il ne faut pas y avoir deux fois le même type. ===tuple=== Non testé la migration. ===bind=== Les deux sont compatibles. Mais il est préférable de les remplacer par des fonctions lambda. ===filesystem=== Dans les cas basiques que j'ai eu, je n'ai pas eu de différences. Mais il y a [[https://www.bfilipek.com/2019/05/boost-to-stdfs.html|quelques différences]] apparemment. {{ :lib:boost:bartek_s_coding_blog_converting_from_boost_to_std_filesystem_2020-03-03_10_10_25_am_.html |Archive du 06/05/2019 le 03/03/2020}} * ''boost::filesystem::ifstream'' #include boost::filesystem::path currentPath; boost::filesystem::ifstream ifs(nextPath); devient #include #include std::filesystem::path currentPath; std::ifstream ifs(nextPath.c_str()); * ''boost::filesystem::copy_option'' Il devient ''std::filesystem::copy_options''. Le nom des enum est différent : ''overwrite_if_exists'' devient ''overwrite_existing''. ''fail_if_exists'' devient ''skip_existing''. * Deprecated ''leaf()'' devient ''filename()''. [[https://www.boost.org/doc/libs/1_72_0/libs/filesystem/doc/deprecated.html|Deprecated names and features]] {{ :lib:boost:filesystem_deprecated_features_2020-04-21_2_58_20_pm_.html |Archive du 29/12/2014 le 21/04/2020}} ===thread=== * ''thread.join'' : si le thread n'est pas ''joinable()'', ''boost'' ne fait rien mais ''std'' génère une exception. ===shared_mutex=== Il n'y a pas d'équivalent car ''std'' ne supporte pas le timeout. Il faut alors faire une boucle où on passe son temps à faire un ''try_lock_shared'' pendant le temps nécessaire. ===scoped_array=== Peut se remplacer sans problème par un ''std::vector''. ===algorithm=== * string std::string str; return boost::to_upper_copy(str); devient std::string str; std::transform(str.begin(), str.end(), str.begin(), ::toupper); return std::move(str); ===boost::lexical_cast=== ''boost::lexical_cast(number)'' devient ''std::to_string(number)''.