Fabien LE LEZ writes:
| On Fri, 14 Jul 2006 10:09:37 +0200, Jean-Marc Bourguet
| :
| >C'est une expression entière non constante. Tu ne peux pas
| >faire quelque chose comme:
| >int i[(0, 5)];
| Ah, OK. J'imagine que c'est parce que c'est considéré comme
| la valeur de retour d'une fonction ? (En l'occurence,
| 'operator,')
Je ne sais pas. C'est une règle que C++ a hérité de C. Si on doit
considérer « operator, » comme une fonction, qu'en est-il de
« operator+ » dans « 5 + 2 » ?
À la dernière réunion de Berlin, j'ai tenté de changer cette règle
(dans notre proposition d'expression constante généralisée) mais je me
suis vite rendu compte que cela change la sémantique de programmes
C++ actuels. Donc j'ai fait machine arrière. La question de savoir si
ces programmes sont suffisamment importants est un autre débat, un
débat dans lequel je ne voudrais pas m'engager :-)
Par exemple,
void f(void*);
void f(int);
f((5, 0)); // OK : appelle "void f(int)"
f(0); // ERROR : ambiguité
Fabien LE LEZ <gramster@gramster.com> writes:
| On Fri, 14 Jul 2006 10:09:37 +0200, Jean-Marc Bourguet
| <jm@bourguet.org>:
| >C'est une expression entière non constante. Tu ne peux pas
| >faire quelque chose comme:
| >int i[(0, 5)];
| Ah, OK. J'imagine que c'est parce que c'est considéré comme
| la valeur de retour d'une fonction ? (En l'occurence,
| 'operator,')
Je ne sais pas. C'est une règle que C++ a hérité de C. Si on doit
considérer « operator, » comme une fonction, qu'en est-il de
« operator+ » dans « 5 + 2 » ?
À la dernière réunion de Berlin, j'ai tenté de changer cette règle
(dans notre proposition d'expression constante généralisée) mais je me
suis vite rendu compte que cela change la sémantique de programmes
C++ actuels. Donc j'ai fait machine arrière. La question de savoir si
ces programmes sont suffisamment importants est un autre débat, un
débat dans lequel je ne voudrais pas m'engager :-)
Par exemple,
void f(void*);
void f(int);
f((5, 0)); // OK : appelle "void f(int)"
f(0); // ERROR : ambiguité
Fabien LE LEZ writes:
| On Fri, 14 Jul 2006 10:09:37 +0200, Jean-Marc Bourguet
| :
| >C'est une expression entière non constante. Tu ne peux pas
| >faire quelque chose comme:
| >int i[(0, 5)];
| Ah, OK. J'imagine que c'est parce que c'est considéré comme
| la valeur de retour d'une fonction ? (En l'occurence,
| 'operator,')
Je ne sais pas. C'est une règle que C++ a hérité de C. Si on doit
considérer « operator, » comme une fonction, qu'en est-il de
« operator+ » dans « 5 + 2 » ?
À la dernière réunion de Berlin, j'ai tenté de changer cette règle
(dans notre proposition d'expression constante généralisée) mais je me
suis vite rendu compte que cela change la sémantique de programmes
C++ actuels. Donc j'ai fait machine arrière. La question de savoir si
ces programmes sont suffisamment importants est un autre débat, un
débat dans lequel je ne voudrais pas m'engager :-)
Par exemple,
void f(void*);
void f(int);
f((5, 0)); // OK : appelle "void f(int)"
f(0); // ERROR : ambiguité
Note qu'à tout moment, v est un pointeur valide, sur lequel on peut
appeler delete sans problème.
Volumetric*
create( Kind k )
{
Map::const_iterator iter = map.find( k ) ;
return iter == map.end()
? NULL
: iter->second->create() ;
}
L'avantage, évidemment, c'est que je peux ajouter des types sans toucher
au code existant.
Note qu'à tout moment, v est un pointeur valide, sur lequel on peut
appeler delete sans problème.
Volumetric*
create( Kind k )
{
Map::const_iterator iter = map.find( k ) ;
return iter == map.end()
? NULL
: iter->second->create() ;
}
L'avantage, évidemment, c'est que je peux ajouter des types sans toucher
au code existant.
Note qu'à tout moment, v est un pointeur valide, sur lequel on peut
appeler delete sans problème.
Volumetric*
create( Kind k )
{
Map::const_iterator iter = map.find( k ) ;
return iter == map.end()
? NULL
: iter->second->create() ;
}
L'avantage, évidemment, c'est que je peux ajouter des types sans toucher
au code existant.
+KanzeVolumetric*
create( Kind k )
{
Map::const_iterator iter = map.find( k ) ;
return iter == map.end()
? NULL
: iter->second->create() ;
}
L'avantage, évidemment, c'est que je peux ajouter des types
sans toucher au code existant.
Voilà un bout de code qui m'interesse mais dont je ne suis pas
certain de cerner toute la portée.
Tu mets quoi dans ce map Map<Key,Val> ?
donc, en Key tu mettrais kind, mais en Val ? Vu que tu préconises un
create() sur un objet de type Val, je supposes Val serait un type
pointeur sur Fabrique, une classe abstraite dérivée en autant de
classes fabriqueKind_i que j'ai de types Kind_i... C'est pas une
implémentation du pattern fabrication ?
+Kanze
Volumetric*
create( Kind k )
{
Map::const_iterator iter = map.find( k ) ;
return iter == map.end()
? NULL
: iter->second->create() ;
}
L'avantage, évidemment, c'est que je peux ajouter des types
sans toucher au code existant.
Voilà un bout de code qui m'interesse mais dont je ne suis pas
certain de cerner toute la portée.
Tu mets quoi dans ce map Map<Key,Val> ?
donc, en Key tu mettrais kind, mais en Val ? Vu que tu préconises un
create() sur un objet de type Val, je supposes Val serait un type
pointeur sur Fabrique, une classe abstraite dérivée en autant de
classes fabriqueKind_i que j'ai de types Kind_i... C'est pas une
implémentation du pattern fabrication ?
+KanzeVolumetric*
create( Kind k )
{
Map::const_iterator iter = map.find( k ) ;
return iter == map.end()
? NULL
: iter->second->create() ;
}
L'avantage, évidemment, c'est que je peux ajouter des types
sans toucher au code existant.
Voilà un bout de code qui m'interesse mais dont je ne suis pas
certain de cerner toute la portée.
Tu mets quoi dans ce map Map<Key,Val> ?
donc, en Key tu mettrais kind, mais en Val ? Vu que tu préconises un
create() sur un objet de type Val, je supposes Val serait un type
pointeur sur Fabrique, une classe abstraite dérivée en autant de
classes fabriqueKind_i que j'ai de types Kind_i... C'est pas une
implémentation du pattern fabrication ?