Outils pour utilisateurs

Outils du site


lib:boost

Ceci est une ancienne révision du document !


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

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.

Executor sur GitHub

boost::algorithm

boost::algorithm::join et boost::adaptors::transformed

#include <iostream>
 
#include <boost/algorithm/string/join.hpp>
#include <boost/range/adaptor/transformed.hpp>
 
#include <string>
 
struct Data
{
  std::string name;
  std::string version;
};
 
int main()
{
  std::vector<Data> 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.

<note important>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.</note>

  • boost::ref et std::ref.

assign

Utiliser list_initializer.

//const std::list<int> primes = boost::assign::list_of(2)(3)(5)(7)(11);
const std::list<int> 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<const int, int> m;
int key, value;
BOOST_FOREACH(boost::tie(key, value), m)
{
  // do something with key and value here
}
std::map<int, int> 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<int&>.

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<int, double> v = 5;
double d = boost::get<double>(v); // Génère une exception
double *d = boost::get<double>(&v); // Renvoi nullptr

devient

std::variant<int, double> v = 5;
double d = std::get<double>(v); // Génère une exception
double *d = std::get_if<double>(&v); // Renvoi nullptr

boost::apply_visitor devient std::visit.

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 quelques différences apparemment. Archive du 06/05/2019 le 03/03/2020

  • boost::filesystem::ifstream
#include <boost/filesystem/fstream.hpp>
 
boost::filesystem::path currentPath;
boost::filesystem::ifstream ifs(nextPath);

devient

#include <filesystem>
#include <fstream>
 
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.

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.

lib/boost.1587032518.txt.gz · Dernière modification : 2020/04/16 12:21 de root