Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo

precedent    sommaire    suivant   


Qu'est-ce que Boost ?
auteur : Aurelien.Regat-Barrel
Boost est un ensemble de bibliothèques C++ gratuites et portables dont certaines seront intégrées au prochain standard C++ (voir Qu'est-ce que C++0x ?). On y retrouve donc naturellement les concepts de la bibliothèque standard actuelle, et en particulier ceux de la STL avec laquelle elle se mélange parfaitement. Boost est très riche : elle fournit notamment des bibliothèques pour :


La liste complète des bibliothèques classées par catégories est disponible ici : http://www.boost.org/libs/libraries.htm.


Comment utiliser les pointeurs intelligents de Boost ?
auteurs : Aurelien.Regat-Barrel, Loulou24
Boost met à notre dispositions plusieurs types de pointeurs intelligents (voir en Boost Smart Pointers). Les plus couramment utilisés sont boost::shared_ptr et boost::shared_array (pour les tableaux) qui sont des pointeurs intelligents fonctionnant par comptage de référence:

#include <iostream>
#include <string>
#include <boost/shared_ptr.hpp>

class Test
{
public:
    Test( const char * Name ):
        name( Name )
    {
    }

    ~Test()
    {
        std::cout << "Destruction de " << this->name << '\n'; 
    }
    
    void printName()
    { 
        std::cout << this->name << '\n'; 
    }

private:
    std::string name;
};

// déclaration du type pointeur intelligent sur Test
typedef boost::shared_ptr<Test> TestPtr;

int main()
{
    TestPtr ptr; // pointeur initialisé à NULL

    {
        // pointeur temporaire détruit à la fin du bloc
        TestPtr ptr_tmp( new Test( "objet1" ) );

        // initialiser ptr avec ptr_tmp
        ptr = ptr_tmp;
    } // ici, ptr_tmp est détruit, mais ptr reste valide

    ptr->printName(); // OK, affiche "objet1"

    // réinitialiser le pointeur avec un nouvel objet
    // objet1 est détruit, objet2 est créé
    ptr.reset( new Test( "objet2" ) );

    ptr->printName(); // OK, affiche "objet2"
    
    // copie du pointeur sur objet2
    TestPtr ptr2 = ptr;

    // mise à NULL de ptr
    ptr.reset(); // rien ne se passe

    // mise à NULL de ptr2
    ptr2.reset(); // objet2 est détruit
    
    // utilisation du pointeur NULL : erreur en mode Debug
    ptr->printName(); // Assertion failed: px != 0
}
Ce programme produit le résultat suivant s'il est compilé pour ne pas ignorer les assertions:

objet1
Destruction de objet1
objet2
Destruction de objet2
Assertion failed: px != 0

Si la donnée manipulée est une ressource un peu particulière, et ne doit pas être libérée via delete, on peut spécifier via un foncteur le comportement à adopter lors de la libération du pointeur intelligent :

struct Delete
{
    void operator ()(Test*& Ptr) const
    {
        cout << "Destruction";
        delete Ptr;
    }
};

int main()
{
    shared_ptr<Test> Ptr(new Test(), Delete());
}


Comment découper une chaîne avec boost::tokenizer ?
auteur : Aurelien.Regat-Barrel
Le programme suivant illustre comment utiliser boost::tokenizer pour découper une chaîne de caractères selon des séparateurs par défaut, ou selon une liste de séparateurs bien précis :

#include <iostream>
#include <boost/tokenizer.hpp>

// découpe la chaine avec les séparateurs par défaut
void split( const std::string & Msg )
{
    // utiliser le tokenizer par défaut
    boost::tokenizer<> tok( Msg );

    // itérer la séquence de tokens
    for ( boost::tokenizer<>::const_iterator i = tok.begin();
          i != tok.end();
          ++i )
    {
        // afficher chaque token extrait
        std::cout << *i << '\n';
    }
}

// découpe la chaine selon les séparateurs donnés
void split( const std::string & Msg, const std::string & Separators )
{
    // typedef pour alléger l'écriture
    typedef boost::tokenizer<boost::char_separator<char> > my_tok;

    // séparateur personnalisé
    boost::char_separator<char> sep( Separators.c_str() );

    // construire le tokenizer personnalisé
    my_tok tok( Msg, sep );

    // itérer la séquence de tokens
    for ( my_tok::const_iterator i = tok.begin();
          i != tok.end();
          ++i )
    {
        // afficher chaque token extrait
        std::cout << *i << '\n';
    }
}

int main()
{
    std::cout << "-- exemple 1 --\n";

    split( "mot1;mot2;   ;mot3;;mot4;mot5;" );
   
    std::cout << "-- exemple 2 --\n";

    split( "mot-compose1;mot,compose2;[mot][compose3];mot compose4;<mot><compose><5>", ";" );
}
Ce programme produit le résultat suivant :

-- exemple 1 --
mot1
mot2
mot3
mot4
mot5
-- exemple 2 --
mot-compose1
mot,compose2
[mot][compose3]
mot compose4
<mot><compose><5>
Notez que les token vides (";;" par exemple) ne sont pas pris en compte.


precedent    sommaire    suivant   

Consultez les autres F.A.Q's

Valid XHTML 1.1!Valid CSS!


Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduit en français ici.
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.
Certaines parties de ce document sont sous copyright Marshall Cline Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à trois licences, en fonction des contributeurs :
- Les contributions de Clément Cunin et LFE sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies des contributions de Clément Cunin et LFE tant que cette note apparaît clairement :
"Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement".
- Les contributions de Marshall Cline sont sous copyright
- Pour ce qui est des autres contributions : Copyright © 2005 Developpez LLC : Tous droits réservés Developpez LLC. Aucune reproduction, ne peut en être faite sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com