 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Stephane Wirtel Guest
|
Posted: Mon Jul 18, 2005 3:41 pm Post subject: Afficher le contenu d'une std::list <boost::any> ? |
|
|
Bonjour à tous,
En regardant dans les exemples de Boost::Any, j'ai créé une liste contenant des données de types différents.
Par exemple le code suivant (imaginé de toute pièce) fonctionne (car testé hier soir).
template <typename dataType> class Field {
public:
Field (const std::string& pFieldName) : mFieldName (pFieldName), mFieldValue (dataType ()) {
}
~Field () {
}
const std::string& getName () const {
return mFieldName;
}
dataType getValue () {
return mFieldValue;
}
private:
dataType mFieldValue;
std::string mFieldName;
};
typedef std::list <boost::any> Many;
Many many;
many.push_back (Field <int> ("Age"));
many.push_back (Field <bool> ("IsValue"));
Mon soucis est que lorsque je désire afficher le contenu de la liste des Field
se trouvant dans ma std::list, j'ai une erreur lors de la compilation me disant
que mon getValue et getName ne sont pas joignable.
Donc, par exemple, ceci ne fonctionne pas :|
for (Many::iterator it = many.begin (); it != many.end (); ++it) {
std::cout << "Name : " << it->getName () << std::endl;
std::cout << " Value : " << it->getValue () << std::endl;
}
Peut-être avez-vous déjà songé à ce problème, mais auriez-vous peut-être déjà trouvé une solution ?
En tout cas, ce soir en rentrant du boulot, je regarderai encore pour trouver une solution à mon problème.
Bonne soirée,
Stéphane
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Mon Jul 18, 2005 4:38 pm Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
"Stephane Wirtel" <com.descasoft (AT) wirtel (DOT) stephane> a écrit dans le message de
news:dbgiko$587$1 (AT) news (DOT) brutele.be...
| Quote: | Bonjour à tous,
En regardant dans les exemples de Boost::Any, j'ai créé une liste
contenant des données de types différents.
Par exemple le code suivant (imaginé de toute pièce) fonctionne (car testé
hier soir).
template <typename dataType> class Field {
public:
Field (const std::string& pFieldName) : mFieldName (pFieldName),
mFieldValue (dataType ()) {
}
~Field () {
}
const std::string& getName () const {
return mFieldName;
}
dataType getValue () {
return mFieldValue;
}
private:
dataType mFieldValue;
std::string mFieldName;
};
typedef std::list <boost::any> Many;
Many many;
many.push_back (Field <int> ("Age"));
many.push_back (Field <bool> ("IsValue"));
Mon soucis est que lorsque je désire afficher le contenu de la liste des
Field
se trouvant dans ma std::list, j'ai une erreur lors de la compilation me
disant
que mon getValue et getName ne sont pas joignable.
Donc, par exemple, ceci ne fonctionne pas :|
for (Many::iterator it = many.begin (); it != many.end (); ++it) {
std::cout << "Name : " << it->getName () << std::endl;
std::cout << " Value : " << it->getValue () << std::endl;
}
Peut-être avez-vous déjà songé à ce problème, mais auriez-vous peut-être
déjà trouvé une solution ?
En tout cas, ce soir en rentrant du boulot, je regarderai encore pour
trouver une solution à mon problème.
|
for (Many::iterator it = many.begin (); it != many.end (); ++it) {
std::cout << "Name : " << it.getName () << std::endl;
std::cout << " Value : " << it.getValue () << std::endl;
}
--
-Stan
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Mon Jul 18, 2005 5:11 pm Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
"Stephane Wirtel" <com.descasoft (AT) wirtel (DOT) stephane> a écrit dans le message de
news:dbgiko$587$1 (AT) news (DOT) brutele.be...
| Quote: | Bonjour à tous,
En regardant dans les exemples de Boost::Any, j'ai créé une liste
contenant des données de types différents.
Par exemple le code suivant (imaginé de toute pièce) fonctionne (car testé
hier soir).
template <typename dataType> class Field {
public:
Field (const std::string& pFieldName) : mFieldName (pFieldName),
mFieldValue (dataType ()) {
}
~Field () {
}
const std::string& getName () const {
return mFieldName;
}
dataType getValue () {
return mFieldValue;
}
private:
dataType mFieldValue;
std::string mFieldName;
};
typedef std::list <boost::any> Many;
Many many;
many.push_back (Field <int> ("Age"));
many.push_back (Field <bool> ("IsValue"));
Mon soucis est que lorsque je désire afficher le contenu de la liste des
Field
se trouvant dans ma std::list, j'ai une erreur lors de la compilation me
disant
que mon getValue et getName ne sont pas joignable.
Donc, par exemple, ceci ne fonctionne pas :|
for (Many::iterator it = many.begin (); it != many.end (); ++it) {
std::cout << "Name : " << it->getName () << std::endl;
std::cout << " Value : " << it->getValue () << std::endl;
}
Peut-être avez-vous déjà songé à ce problème, mais auriez-vous peut-être
déjà trouvé une solution ?
En tout cas, ce soir en rentrant du boulot, je regarderai encore pour
trouver une solution à mon problème.
|
for (Many::iterator it = many.begin (); it != many.end (); ++it) {
std::cout << "Name : " << (*it).getName () << std::endl;
std::cout << " Value : " << (*it).getValue () << std::endl;
}
Mais il y a mieux.
--
Stan .
|
|
| Back to top |
|
 |
Stéphane Wirtel Guest
|
Posted: Mon Jul 18, 2005 5:51 pm Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
quel est la diff entre (*it).getValue () et it->getValue () ? Faudrait
m'expliquer, c'est un notation qui est différente, mais qui
représente la même chose.
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Mon Jul 18, 2005 5:57 pm Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
Stephane Wirtel wrote:
| Quote: | Donc, par exemple, ceci ne fonctionne pas :|
for (Many::iterator it = many.begin (); it != many.end (); ++it) {
std::cout << "Name : " << it->getName () << std::endl;
std::cout << " Value : " << it->getValue () << std::endl;
}
|
for(Many::iterator it = many.begin(); it != many.end(); ++it)
{
if(Field(&*it))
{
std::cout << "Name : " << f->getName();
std::cout << " Value : " << f->getValue() << 'n';
}else if(Field(&*it))
{
std::cout << "Name : " << f->getName();
std::cout << " Value : " << f->getValue() << 'n';
}
}
mais c'est moche car il faut ajouter un nouveau test pour chaque nouveau type.
Pourquoi pas tout simplement
class FieldBase
{
public:
virtual std::string const& getName() const = 0;
virtual void printValue(std::ostream&) const = 0;
virtual ~FieldBase() {}
}; // class FieldBase
std::ostream& operator<<(std::ostream& o, FieldBase const& f) { f.printValue(o); return o; }
template
{
public:
Field(const std::string& pFieldName) : mFieldValue(dataType()), mFieldName(pFieldName) {}
~Field() {}
std::string const& getName() const { return mFieldName; }
dataType getValue() const { return mFieldValue; }
void printValue(std::ostream& o) const { o << getValue(); }
private:
dataType mFieldValue;
std::string mFieldName;
}; // class Field
template
typedef std::list<boost::shared_ptr Many;
....
Many many;
many.push_back(make_shared_ptr(new Field<int>("Age")));
many.push_back(make_shared_ptr(new Field<bool>("IsValue")));
for(Many::iterator it = many.begin(); it != many.end(); ++it)
{
std::cout << "Name : " << (**it).getName();
std::cout << " Value : " << **it << 'n';
}
Falk
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Mon Jul 18, 2005 6:18 pm Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
"Stéphane Wirtel" <stephane.wirtel (AT) gmail (DOT) com> a écrit dans le message de
news:1121709084.316431.313130 (AT) g47g2000cwa (DOT) googlegroups.com...
| Quote: | quel est la diff entre (*it).getValue () et it->getValue () ? Faudrait
m'expliquer, c'est un notation qui est différente, mais qui
représente la même chose.
|
Le source envoyé est-il celui que tu as testé ?
Les deux notations fonctionnent.
--
-Stan
|
|
| Back to top |
|
 |
Matthieu Moy Guest
|
Posted: Mon Jul 18, 2005 6:24 pm Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
"Stéphane Wirtel" <stephane.wirtel (AT) gmail (DOT) com> writes:
| Quote: | quel est la diff entre (*it).getValue () et it->getValue () ?
|
Avec des vrais pointeurs, aucune.
Avec des types définis par l'utilisateur, en surchargeant les
opérateurs "*" et "->", c'est la responsabilité de l'utilisateur de
faire en sorte que ce soit la même chose. En général, c'est le cas.
Pour un contre-exemple (laid, j'en conviens) :
#include <iostream>
using namespace std;
struct bar {
void f() {cout << "bar::f" << endl;}
};
struct foo {
bar * operator -> () {
cout << "->" << endl;
return new bar();
}
bar& operator * () {
cout << "*" << endl;
return *(new bar());
}
};
int main() {
foo F;
F->f();
(*F).f();
}
--
Matthieu
|
|
| Back to top |
|
 |
Stephane Wirtel Guest
|
Posted: Mon Jul 18, 2005 7:01 pm Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
Merci pour la solution,
L'idée est de pouvoir créer une liste de champs d'une table, afin de ne plus devoir les introduire à
la main dans la requête SQL, ce qui me permettrait de diminuer les erreurs dans les requetes SQL.
Sinon, est-ce que quelqu'un connait une lib qui fait environ ce que j'aimerais ?
Encore merci,
Stéphane
|
|
| Back to top |
|
 |
Stephane Wirtel Guest
|
Posted: Mon Jul 18, 2005 7:06 pm Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
Je suis tout à fait d'accord avec toi, mais dans le cas de boost::any, rien ne change.
|
|
| Back to top |
|
 |
Stéphane Wirtel Guest
|
Posted: Mon Jul 18, 2005 9:08 pm Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
Je viens de regarder plus attentivement, mais bien que la lecture soit
possible, aurais-tu une info pour pouvoir écrire dans ces différentes
variables ?
Pas facile en tout cas de trouver un design qui réponde à ma question
:|
Bonne soirée,
Stéphane
|
|
| Back to top |
|
 |
Matthieu Moy Guest
|
Posted: Mon Jul 18, 2005 9:10 pm Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
"Stéphane Wirtel" <stephane.wirtel (AT) gmail (DOT) com> writes:
| Quote: | Je viens de regarder plus attentivement, [...]
|
Merci de citer la partie pertinente du message auquel tu réponds.
Sinon, on ne sait pas de quoi tu parles ...
--
Matthieu
|
|
| Back to top |
|
 |
Stéphane Wirtel Guest
|
Posted: Tue Jul 19, 2005 5:20 am Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
Excuse moi mathieu,
je parlais de la seconde partie du mail de Falk Tannhäuser en ce qui
concernet l'héritage de la classe FieldBase pour créer la classe
template Field.
La question était comment modifier la valeur du champs, je pensais à un
stringstream, que je passerais à une méthode virtuelle de FieldBase,
mais qui serait concrete dans la classe Field.
Qu'en penses-tu ?
Une autre idée ?
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Tue Jul 19, 2005 7:34 am Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
"Stephane Wirtel" <stephane.wirtel (AT) belgacom (DOT) net> a écrit dans le message de
news: dbguam$b65$1 (AT) news (DOT) brutele.be...
| Quote: | Merci pour la solution,
L'idée est de pouvoir créer une liste de champs d'une table, afin de ne
plus devoir les introduire à la main dans la requête SQL, ce qui me
permettrait de diminuer les erreurs dans les requetes SQL.
Sinon, est-ce que quelqu'un connait une lib qui fait environ ce que
j'aimerais ?
|
Ce que tu veux faire semble être un wrapper.
Il en existe :
http://www.alhem.net/project/mysql/index.html
--
-Stan
|
|
| Back to top |
|
 |
Matthieu Moy Guest
|
Posted: Tue Jul 19, 2005 8:06 am Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
"Stéphane Wirtel" <stephane.wirtel (AT) gmail (DOT) com> writes:
| Quote: | Excuse moi mathieu,
|
Tu récidives, là .
http://www.giromini.org/usenet-fr/repondre.html
--
Matthieu
|
|
| Back to top |
|
 |
Stéphane Wirtel Guest
|
Posted: Tue Jul 19, 2005 8:20 am Post subject: Re: Afficher le contenu d'une std::list <boost::any> ? |
|
|
Excuse moi Stan, je n'ai pas le temps d'y regarder au boulot, mais je
viens de m'envoyer le lien sur mon mail perso, ainsi j'y regarderai ce
soir.
J'ai vu qu'il y avait aussi une classe permettant de créer depuis du
SQL, des objets c++ correspondants à la structure des tables, du moins
j'espère que cela est bien le but.
Merci,
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|