OVH Cloud OVH Cloud

Question de conception via les templates.

34 réponses
Avatar
Stephane Wirtel
Bonjour,

Voici un bout de code que je suis entrain de pondre afin de créer une
lecture de settings et initialisation de ces fameux settings de manière
automatique.

#include <iostream>
#include <string>
#include <list>

using namespace std;

template <class T> class ItemSetting {
public:
ItemSetting (void) {
// cout << "ItemSetting::ItemSetting" << endl;
}
~ItemSetting (void) {
// cout << "ItemSetting::~ItemSetting" << endl;
}
};

class Settings {
public:
Settings (void) {
cout << "Settings::Settings" << endl;
}
~Settings (void) {
cout << "Settings::~Settings" << endl;
}
private:
ItemSetting <bool> boolItemSetting;
ItemSetting <int> intItemSetting;
ItemSetting <char> charItemSetting;
ItemSetting <double> doubleItemSetting;
};

int main (int argc, char **argv) {
cout << "Size of Setting : " << sizeof (Settings) << endl;
return 0;
}

Dans mon main, ou via le constructeur de Settings, j'aimerais savoir si il
est possible de faire une boucle sur tous les variables "ItemSetting <XXX>"
se trouvant dans la partie "private" et d'initialiser toutes les variables.

Je me dis que j'aurais pû créer un std::vector de tous les ItemSettings et
via un std::iterator les initialiser via une boucle. Le problème est que
l'on ne peut pas mettre un type template dans un container de la STL.

Est-ce que quelqu'un aurait déjà songé à ce style de programmation ?

Merci,

PS : Il ne s'agit que d'un essai, pour voir les possibilités de la
Meta-programmation.

--
Stephane Wirtel <stephane.wirtel@belgacom.net>

10 réponses

1 2 3 4
Avatar
Gabriel Dos Reis
Pierre THIERRY writes:

| Le Tue, 10 May 2005 01:21:51 -0700, kanze a écrit :
| > Qu'on te donne des références, parce que le sujet dépasse ce qu'on
| > peut raisonablement répondre, je veux bien, mais ce n'est pas une
| > raison devenir agressif.
|
| Peut-être était-ce la formulation. « Pourrais-tu me parler des
| typelists ? » est tout de même une question très différente de, par
| exemple, « auriez-vous des références sur le sujet ? ».

?

-- Gaby
Avatar
Franck Branjonneau
Stephane Wirtel écrivait:

Pourrais-tu me parler des typelists ?


Les typelists sont une généralisation du code illustré ici :

#include <iostream>
#include <string>


template< typename _X, typename _Y >
struct IsSameType {

enum { value= false };
};

template<>
template< typename _X >
struct IsSameType< _X, _X > {

enum { value= true };
};


template< int _number >
struct Property;

template< typename _Head, typename _Tail >
struct PropertyList:
public _Head,
public _Tail {

typedef _Head Head;
typedef _Tail Tail;

template< typename _Property >
typename _Property::Value const &
property() const {

if(IsSameType< _Property, _Head >::value) {

return reinterpret_cast< typename _Property::Value const & >(Head::value_);
}

return Tail::template property< _Property >();
}

template< typename _Property >
typename _Property::Value &
property(
typename _Property::Value const & value) {

if(IsSameType< _Property, _Head >::value) {

return reinterpret_cast< typename _Property::Value & >(Head::value_)= value;

} else {

return Tail::template property< _Property >(value);
}
}

};

template<>
template< typename _Head >
struct PropertyList< _Head, void >:
public _Head {

typedef _Head Head;
typedef void Tail;

template< typename _Property >
typename _Property::Value const &
property() const {

return reinterpret_cast< typename _Property::Value const & >(Head::value_);
}

template< typename _Property >
typename _Property::Value &
property(
typename _Property::Value const & value) {

return reinterpret_cast< typename _Property::Value & >(Head::value_)= value;
}
};


template< typename _Value >
struct BasicProperty {

typedef _Value Value;


Value value_;
};

struct OperatingSystem: BasicProperty< std::string > {};
struct Port: BasicProperty< int > {};
struct Activity: BasicProperty< bool > {};

typedef PropertyList< OperatingSystem,
PropertyList< Port,
PropertyList< Activity,
void > > > Properties;

int
main() {

Properties properties;

properties.property< OperatingSystem >(std::string("Linux"));
properties.property< Port >(25);
properties.property< Activity >(false);

std::cout << "Operating system: " << properties.property< OperatingSystem >();
std::cout << "nPort: " << properties.property< Port >();
std::cout << "nActivity: " << properties.property< Activity >() << "n";
}
--
Franck Branjonneau

Avatar
Gabriel Dos Reis
Franck Branjonneau writes:

| Stephane Wirtel écrivait:
|
| > Pourrais-tu me parler des typelists ?
|
| Les typelists sont une généralisation du code illustré ici :

J'espère que cela n'arrive pas en vrai.

| #include <iostream>
| #include <string>
|
|
| template< typename _X, typename _Y >

Eviter _[A-Z_]*.

| struct IsSameType {
|
| enum { value= false };
| };
|
| template<>
| template< typename _X >
| struct IsSameType< _X, _X > {
|
| enum { value= true };
| };

Ceci n'est pas directement lié à la notion de typelist.

| template< int _number >
| struct Property;
|
| template< typename _Head, typename _Tail >
| struct PropertyList:

Depuis les temps immémoriaux, cela s'appele « cons » -- mais si on
veut vendre des bouquins de nos jours, il faut visiblement changer de
terminologie, comme ça tout le monde pense que c'est nouveau.

[...]

| template< typename _Property >
| typename _Property::Value const &
| property() const {
|
| return reinterpret_cast< typename _Property::Value const & >(Head::value_);

Oh non.

[...]


Typelist, comme son nom ne l'indique pas, c'est une liste de type.
Mais comme en C++ traditionnel un type n'est pas quelque chose qu'on
pourrait mettre dans une liste traditionnelle, il faut utiliser une
structure de données inhabutuelle. En fait juste changer le « medium. »
On change pas « cons, head (car), tail (cdr) », jjste comme on
l'exprime. En C++, on utilise le système de type, parce que les
templates formes une sorte lambda calcul donc tu peux les utiliser
pour encoder des structures de données.
Habituellement, je suggère aux gens qui s'aventurent dans cette
histoire de regarder et digérer

http://mitpress.mit.edu/sicp/sicp.html

avant de lire les bouquins ou autres qui leur obscurciront les idées.

Par exemple,

http://www.cmla.ens-cachan.fr/~dosreis/C++/talks/metaprogramming-in-cxx.pdf

est explicitement écrit pour faire le rapprochement et faire sentir
qu'il n'y a pas que le medium qui change et non le message.

-- Gaby
Avatar
Luc Hermitte
Bonsoir.

Stephane Wirtel wrote in
news:d5ivrf$a3p$:

Voici un bout de code que je suis entrain de pondre afin de créer une
lecture de settings et initialisation de ces fameux settings de
manière automatique.


hum. Cela m'évoque l'objectif de boost.program_option ...

--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>

Avatar
Pierre THIERRY
Le Tue, 10 May 2005 16:48:40 +0200, Gabriel Dos Reis a écrit :
Peut-être était-ce la formulation. « Pourrais-tu me parler des
typelists ? » est tout de même une question très différente de, par
exemple, « auriez-vous des références sur le sujet ? ».
?



Les listes et forums ne sont pas, pour moi, une hotline. C'est un lieu
d'échange, où chacun donne de son temps pour aider les autres, et en
profiter pour apprendre. Cela fait que l'on se doit, par respect pour le
temps donné, de respecter certaines règles.

Notez qu'on ferait bien de les respecter tout le temps, même quand on
s'adresse à une hotline ou un enseignant payants, mais ça me semble être
impératif dans le cadres des listes et des forums.

La règle me semble l'algorithme récursif suivant :

- faire une recherche par soi-même sur le problème rencontré (sur les
moteurs de recherche, avec comme mots-clefs l'erreur rencontrée, par
exemple) ou sur le sujet abordé (sur les moteurs de recherche ou dans
les catalogues de bibliothèques, avec comme mots-clefs les noms des
concepts),
- lire attentivement les documents trouvés, et s'il reste des zones
d'ombre, poser des questions ciblées,
- si l'on ne trouve pas, ou trop peu de choses, expliquer comment on a
cherché et demander des pistes,
- avec les pistes, reprendre au début.

On peut aussi, quand on a glané des références, demander ce qu'elles
valent avant de se lancer dans ses lectures.

Et bien sûr, toujours lire la documentation avant de faire n'importe
quoi avec un outil.

Pour ma part, c'est la très forte pression dans ce sens, rencontrée
notamment sur les listes Debian, qui m'a fait acquérir une partie de mon
autonomie aujourd'hui. Et je m'en sers régulièrement quand je forme
quelqu'un.

Je pars du principe qu'il est intelligent et capable, le lui fait
sentir, et de fait, ai certaines exigences envers lui. Ainsi, je le
valorise, le rend autonome, et je n'ai pas à répéter cent fois les mêmes
choses, pourtant bien expliquées dans les documentations disponibles.

Les questions se limitent vite à « je n'ai jamais eu à chercher ce genre
d'information, par pù dois-je commencer ? » et « j'ai attentivement
étudié X, mais je ne comprends tel ou tel détail ».

Pédagogiquement,
Nowhere man
--

OpenPGP 0xD9D50D8A


Avatar
Gabriel Dos Reis
Pierre THIERRY writes:

| Le Tue, 10 May 2005 16:48:40 +0200, Gabriel Dos Reis a écrit :
| > > Peut-être était-ce la formulation. « Pourrais-tu me parler des
| > > typelists ? » est tout de même une question très différente de, par
| > > exemple, « auriez-vous des références sur le sujet ? ».
| > ?
|
| Les listes et forums ne sont pas, pour moi, une hotline. C'est un lieu
| d'échange, où chacun donne de son temps pour aider les autres, et en
| profiter pour apprendre. Cela fait que l'on se doit, par respect pour le
| temps donné, de respecter certaines règles.

Il est vrai que parce qu'on participe aux discussions sur les
newsgroupes en général de manière volontaire, il serait tentant de
croire que le temps qu'on y passe doit être rentabiliser sous une
forme ou une autre -- par exemple obtenir « un grade » qui demande
« soumission et allégeance ». Cela n'est pas comme cela que je conçois
les choses, m'enfin je ne suis pas tout le monde :-)

Un aspect de la pédagogie, c'est aussi amener les gens à poser la
bonne question sans pour autant dépenser des ressources
disproportionnées, comparativement au résultat. Par exemple, répondre
à la question

« Pourrais-tu me parler des typelists ? »

par une réponse à la question

« auriez-vous des références sur le sujet ? »

sans procès. On y fait d'une pierre deux coups : (a) on donne une
réponse utile et formatrice (je l'espère) ; (b) on espère avoir
subtilement attiré l'attention de la personne (ou l'audience).

-- Gaby
Avatar
Pierre THIERRY
Le Wed, 11 May 2005 19:31:04 +0200, Gabriel Dos Reis a écrit :
Il est vrai que parce qu'on participe aux discussions sur les
newsgroupes en général de manière volontaire, il serait tentant de
croire que le temps qu'on y passe doit être rentabiliser sous une
forme ou une autre


Je ne vois pas le rapport entre exiger une forme de respect et chercher
la rentabilité.

par exemple obtenir « un grade » qui demande « soumission et
allégeance »


Tu peux préciser en quoi il peut y avoir soumission et allégence sur un
forum, exactement ? Le seul type de « grade » que je peux imaginer dans
ce cadre est celui dans une échelle de mérite, en fonction des réponses
qu'on fournit habituellement, de leur pertinence, de leur qualité, etc.
La seule chose qu'il octroit est du crédit, à mon sens.

Un aspect de la pédagogie, c'est aussi amener les gens à poser la
bonne question sans pour autant dépenser des ressources
disproportionnées, comparativement au résultat.


C'est bien ce qui est atteint par l'esprit général des forums, AMHA.

Par exemple, répondre à la question

« Pourrais-tu me parler des typelists ? »

par une réponse à la question

« auriez-vous des références sur le sujet ? »

sans procès. On y fait d'une pierre deux coups : (a) on donne une
réponse utile et formatrice (je l'espère) ;


Je n'ai pas tranché sur cette question en mon for intérieur. Pour
l'instant, je serais plutôt incliné à dire que ce n'est pas optimal.

(b) on espère avoir subtilement attiré l'attention de la personne (ou
l'audience).


Le problème, c'est que c'est un peu trop souvent trop subtil, justement.
Le mieux est probablement d'être percutant sans être violent pour
autant. Ce qui n'est pas évident, en fait.

Pensivement,
Nowhere man
--

OpenPGP 0xD9D50D8A

Avatar
Gabriel Dos Reis
Pierre THIERRY writes:

| Le Wed, 11 May 2005 19:31:04 +0200, Gabriel Dos Reis a écrit :
| > Il est vrai que parce qu'on participe aux discussions sur les
| > newsgroupes en général de manière volontaire, il serait tentant de
| > croire que le temps qu'on y passe doit être rentabiliser sous une
| > forme ou une autre
|
| Je ne vois pas le rapport entre exiger une forme de respect et chercher
| la rentabilité.

C'est une observation.

| > par exemple obtenir « un grade » qui demande « soumission et
| > allégeance »
|
| Tu peux préciser en quoi il peut y avoir soumission et allégence sur un
| forum, exactement ?

Encore une fois, c'est une observation.

| Le seul type de « grade » que je peux imaginer dans
| ce cadre est celui dans une échelle de mérite, en fonction des réponses
| qu'on fournit habituellement, de leur pertinence, de leur qualité, etc.
| La seule chose qu'il octroit est du crédit, à mon sens.
|
| > Un aspect de la pédagogie, c'est aussi amener les gens à poser la
| > bonne question sans pour autant dépenser des ressources
| > disproportionnées, comparativement au résultat.
|
| C'est bien ce qui est atteint par l'esprit général des forums, AMHA.
|
| > Par exemple, répondre à la question
| >
| > « Pourrais-tu me parler des typelists ? »
| >
| > par une réponse à la question
| >
| > « auriez-vous des références sur le sujet ? »
| >
| > sans procès. On y fait d'une pierre deux coups : (a) on donne une
| > réponse utile et formatrice (je l'espère) ;
|
| Je n'ai pas tranché sur cette question en mon for intérieur. Pour
| l'instant, je serais plutôt incliné à dire que ce n'est pas optimal.

Par rapport à ?

| > (b) on espère avoir subtilement attiré l'attention de la personne (ou
| > l'audience).
|
| Le problème, c'est que c'est un peu trop souvent trop subtil, justement.

et comment le vois-tu ?

-- Gaby
Avatar
Pierre THIERRY
Le Thu, 12 May 2005 06:48:54 +0200, Gabriel Dos Reis a écrit :
Je n'ai pas tranché sur cette question en mon for intérieur. Pour
l'instant, je serais plutôt incliné à dire que ce n'est pas optimal.
Par rapport à ?

(b) on espère avoir subtilement attiré l'attention de la personne
Le problème, c'est que c'est un peu trop souvent trop subtil,

justement.
et comment le vois-tu ?



Répondre à la « bonne » question lorsque c'est la « mauvaise » qui a été
posée peut être interprété comme le signe que la question était
correcte. Peut-être tout juste l'auteur se demandera pourquoi on lui
répond un peu à côté de la plaque (il avait demandé des explications,
pas des références).

J'ai constaté qu'un grand nombre de sous-entendus et de non-dits passent
tout naturellement à la trappe. De fait, je considère aujourd'hui que la
seule manière vraiment efficace de communiquer, en cas de problème (et
un questionnement inadéquat est un problème, à mon sens), est la
franchise simple et entière.

Il me paraît donc plus optimal de dire clairement que la question est
malvenue, mais que l'on peut volontiers fournir des références, et que
si la personne avait fait telle ou telle recherche, elle en aurait
trouvé la plupart...

C'est nettement plus probant. Qui plus est, je ne vois aucune
contrindication à cette solution, si ce n'est que l'on peut avoir peur
de déplaire, et qu'on peut préférer répondre sans faire de commentaire
sur la forme, pour plaire et se constituer son palmarès de réponse (le
« grade » dont tu parlais).

Franchement,
Nowhere man
--

OpenPGP 0xD9D50D8A



Avatar
Gabriel Dos Reis
Pierre THIERRY writes:

| Le Thu, 12 May 2005 06:48:54 +0200, Gabriel Dos Reis a écrit :
| > > Je n'ai pas tranché sur cette question en mon for intérieur. Pour
| > > l'instant, je serais plutôt incliné à dire que ce n'est pas optimal.
| > Par rapport à ?
| > > > (b) on espère avoir subtilement attiré l'attention de la personne
| > > Le problème, c'est que c'est un peu trop souvent trop subtil,
| > > justement.
| > et comment le vois-tu ?
|
| Répondre à la « bonne » question lorsque c'est la « mauvaise » qui a été
| posée peut être interprété comme le signe que la question était
| correcte.

[...]

| De fait, je considère aujourd'hui que la
| seule manière vraiment efficace de communiquer, en cas de problème (et
| un questionnement inadéquat est un problème, à mon sens), est la
| franchise simple et entière.

Je vois beaucoup d'affirmations, peu d'évidence.

| Il me paraît donc plus optimal de dire clairement que la question est
| malvenue, mais que l'on peut volontiers fournir des références, et que
| si la personne avait fait telle ou telle recherche, elle en aurait
| trouvé la plupart...

Comme ceci



par exemple ?

| C'est nettement plus probant. Qui plus est, je ne vois aucune
| contrindication à cette solution,

Il peut y avoir plusieurs voies, sans contradiction. C'est ce que tu
contestes, e.g. qu'il n'y a qu'une seule voie ?

| si ce n'est que l'on peut avoir peur
| de déplaire, et qu'on peut préférer répondre sans faire de commentaire
| sur la forme, pour plaire et se constituer son palmarès de réponse (le
| « grade » dont tu parlais).

Ah bon.

-- Gaby
1 2 3 4