OVH Cloud OVH Cloud

Travailler avec std::for_each et std::vector< boost::shared_ptr< People > >

3 réponses
Avatar
Stephane Wirtel
Bonsoir,

J'ai un léger soucis de conception, ou tout simplement de compréhension.

Voici le problème que je recontre.

#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <stdexcept>
#include <exception>

#include <boost/shared_ptr.hpp>

#include <libxml/xmlwriter.h>
#include <libxml/encoding.h>

struct People {
std::string firstname;
std::string lastname;

void toXml (xmlTextWriter *xmlWriter);
};

void People::toXml (xmlTextWriter *xmlWriter) {
// ecrire le contenu de la structure Person dans le flux Xml.
}

typedef boost::shared_ptr< People > PeoplePtr;
typedef std::vector< PeoplePtr > Peoples;

int main (int argc, char **argv) {
try {
xmlTextWriterPtr xmlWriter( 0 );
Peoples peoples;
peoples.push_back( PeoplePtr( new People("Stephane", "Wirtel")));

xmlWriter = ...

/// Question 1
std::for_each(
peoples.begin(),
peoples.end(),
???? );
}
catch ( const std::exception & ex ) {
std::cerr << "Exception : " << ex.what() << std::endl;
}
catch (...) {
std::cerr << "Exception inconnue" << std::endl;
}
}

Question 1 :
En fait, j'ai regardé du côté de std::mem_fun, mais je n'ai pas trouvé
la manière de pouvoir utiliser std::for_each, pour que chaque élément
puisse être envoyé dans le flux XML.
Ce qui est plus simple c'est le code suivant :

Peoples::const_iterator it = peoples.begin();
Peoples::const_iterator ending = peoples.end();

for (; it != ending; ++it) {
(*it)->toXml (xmlWriter);
}

mais ce code ne me plait pas :'(
Est-ce quelqu'un aurait une idée pour m'améliorer ?
Si une solution existe, aurait-on la possibilité de m'expliquer la
solution pour une meilleure compréhension ?

Merci beaucoup

Bien à vous,

Stéphane

3 réponses

Avatar
Stephane Wirtel
struct People {
std::string firstname;
std::string lastname;
J'ai oublié le constructeur :

People( const std::string & pFirstname,
const std::string & pLastname ) : firstname( pFirstname ), lastname (pLastname) {
}

void toXml (xmlTextWriter *xmlWriter);
};


Merci

Avatar
Cyrille

mais ce code ne me plait pas :'(
Est-ce quelqu'un aurait une idée pour m'améliorer ?
Si une solution existe, aurait-on la possibilité de m'expliquer la
solution pour une meilleure compréhension ?


Si PeoplePtr était un (People *), alors on pourrait écrire:
std::for_each(
peoples.begin(),
peoples.end(),
std::bind2nd( std::mem_fun( &People::toXml ), xmlWriter ) );

Mais avec un boost::shared_ptr, ça ne fonctionne pas. A ce moment-là
j'utiliserais plutôt:

std::for_each(
peoples.begin(),
peoples.end(),
boost::bind( &People::toXml, _1, xmlWriter ) );

Avatar
Stephane Wirtel
Merci Cyrille,

Stef