il est assez commun je crois d'utiliser des champs de bits, du style
const int PROPERTY1 = 1<<0;
const int PROPERTY2 = 1<<1;
const int PROPERTY3 = 1<<2;
const int PROPERTY4 = 1<<3;
class item
{
void set_property(int property);
}
item i;
i.set_properties(PROPERTY1|PROPERTY2|PROPERTY4);
La chose qui me dérange c'est que tout ça n'est pas très type safe, et
rien n'empêche de taper par exemple 'i.set_properties(RAND_MAX)'.
Ma question est donc: quelles sont les solutions que vous avez
développées pour rendre ce genre de choses plus robustes?
il est assez commun je crois d'utiliser des champs de bits, du style
const int PROPERTY1 = 1<<0;
const int PROPERTY2 = 1<<1;
const int PROPERTY3 = 1<<2;
const int PROPERTY4 = 1<<3;
class item
{
void set_property(int property);
}
item i;
i.set_properties(PROPERTY1|PROPERTY2|PROPERTY4);
La chose qui me dérange c'est que tout ça n'est pas très type safe, et
rien n'empêche de taper par exemple 'i.set_properties(RAND_MAX)'.
Ma question est donc: quelles sont les solutions que vous avez
développées pour rendre ce genre de choses plus robustes?
il est assez commun je crois d'utiliser des champs de bits, du style
const int PROPERTY1 = 1<<0;
const int PROPERTY2 = 1<<1;
const int PROPERTY3 = 1<<2;
const int PROPERTY4 = 1<<3;
class item
{
void set_property(int property);
}
item i;
i.set_properties(PROPERTY1|PROPERTY2|PROPERTY4);
La chose qui me dérange c'est que tout ça n'est pas très type safe, et
rien n'empêche de taper par exemple 'i.set_properties(RAND_MAX)'.
Ma question est donc: quelles sont les solutions que vous avez
développées pour rendre ce genre de choses plus robustes?
C'est peut-être un peu strict comme réponse. On peut créer une classe
propriété (qui contient un int), définir un operateur | sur les objets de
cette classe, contrôler les constructeurs pour que toute propriété soit
soit une des 4 de base soit une copie soit le résultat de |.
C'est peut-être un peu strict comme réponse. On peut créer une classe
propriété (qui contient un int), définir un operateur | sur les objets de
cette classe, contrôler les constructeurs pour que toute propriété soit
soit une des 4 de base soit une copie soit le résultat de |.
C'est peut-être un peu strict comme réponse. On peut créer une classe
propriété (qui contient un int), définir un operateur | sur les objets de
cette classe, contrôler les constructeurs pour que toute propriété soit
soit une des 4 de base soit une copie soit le résultat de |.
Plus sérieusement, stocker un entier dans un "int", ça ne prémunit pas
contre les erreurs, mais au moins ça fait sens.
Stocker plusieurs booléens dans un "int", c'est un abus pur et simple.
Pour stocker plusieurs booléens, on utilise plusieurs "bool", qu'on
peut regrouper dans une classe si ça se justifie.
Plus sérieusement, stocker un entier dans un "int", ça ne prémunit pas
contre les erreurs, mais au moins ça fait sens.
Stocker plusieurs booléens dans un "int", c'est un abus pur et simple.
Pour stocker plusieurs booléens, on utilise plusieurs "bool", qu'on
peut regrouper dans une classe si ça se justifie.
Plus sérieusement, stocker un entier dans un "int", ça ne prémunit pas
contre les erreurs, mais au moins ça fait sens.
Stocker plusieurs booléens dans un "int", c'est un abus pur et simple.
Pour stocker plusieurs booléens, on utilise plusieurs "bool", qu'on
peut regrouper dans une classe si ça se justifie.
On Mon, 30 Mar 2009 19:39:15 +0000 (UTC), Marc
:C'est peut-être un peu strict comme réponse. On peut créer une classe
propriété (qui contient un int), définir un operateur | sur les objets de
cette classe, contrôler les constructeurs pour que toute propriété soit
soit une des 4 de base soit une copie soit le résultat de |.
En gros, tu proposes une solution compliquée pour faire fonctionner un
abus, alors qu'il existe une solution simple et légitime au problème.
On Mon, 30 Mar 2009 19:39:15 +0000 (UTC), Marc
<marc.glisse@gmail.com>:
C'est peut-être un peu strict comme réponse. On peut créer une classe
propriété (qui contient un int), définir un operateur | sur les objets de
cette classe, contrôler les constructeurs pour que toute propriété soit
soit une des 4 de base soit une copie soit le résultat de |.
En gros, tu proposes une solution compliquée pour faire fonctionner un
abus, alors qu'il existe une solution simple et légitime au problème.
On Mon, 30 Mar 2009 19:39:15 +0000 (UTC), Marc
:C'est peut-être un peu strict comme réponse. On peut créer une classe
propriété (qui contient un int), définir un operateur | sur les objets de
cette classe, contrôler les constructeurs pour que toute propriété soit
soit une des 4 de base soit une copie soit le résultat de |.
En gros, tu proposes une solution compliquée pour faire fonctionner un
abus, alors qu'il existe une solution simple et légitime au problème.
enum Properties
{
PROPERTY1 = 1<<0,
PROPERTY2 = 1<<1,
PROPERTY3 = 1<<2,
PROPERTY4 = 1<<3
};
inline Properties operator|(Properties a, Properties b)
{ // Note: Unary '+' forces integral promotion
return static_cast<Properties>(+a | +b);
}
enum Properties
{
PROPERTY1 = 1<<0,
PROPERTY2 = 1<<1,
PROPERTY3 = 1<<2,
PROPERTY4 = 1<<3
};
inline Properties operator|(Properties a, Properties b)
{ // Note: Unary '+' forces integral promotion
return static_cast<Properties>(+a | +b);
}
enum Properties
{
PROPERTY1 = 1<<0,
PROPERTY2 = 1<<1,
PROPERTY3 = 1<<2,
PROPERTY4 = 1<<3
};
inline Properties operator|(Properties a, Properties b)
{ // Note: Unary '+' forces integral promotion
return static_cast<Properties>(+a | +b);
}
On Mon, 30 Mar 2009 15:13:55 +0200, Guillaume GOURDIN
:
>il est assez commun je crois d'utiliser des champs de bits,
>du style
>const int PROPERTY1 = 1<<0;
>const int PROPERTY2 = 1<<1;
>const int PROPERTY3 = 1<<2;
Bof...
>La chose qui me dérange c'est que tout ça n'est pas très type
>safe
Yep.
Il me paraît plus sûr de rassembler les paramètres dans une
classe :
struct Param
{
bool property1;
bool property2;
bool property3;
};
On Mon, 30 Mar 2009 15:13:55 +0200, Guillaume GOURDIN
<tr...@hotmail.com>:
>il est assez commun je crois d'utiliser des champs de bits,
>du style
>const int PROPERTY1 = 1<<0;
>const int PROPERTY2 = 1<<1;
>const int PROPERTY3 = 1<<2;
Bof...
>La chose qui me dérange c'est que tout ça n'est pas très type
>safe
Yep.
Il me paraît plus sûr de rassembler les paramètres dans une
classe :
struct Param
{
bool property1;
bool property2;
bool property3;
};
On Mon, 30 Mar 2009 15:13:55 +0200, Guillaume GOURDIN
:
>il est assez commun je crois d'utiliser des champs de bits,
>du style
>const int PROPERTY1 = 1<<0;
>const int PROPERTY2 = 1<<1;
>const int PROPERTY3 = 1<<2;
Bof...
>La chose qui me dérange c'est que tout ça n'est pas très type
>safe
Yep.
Il me paraît plus sûr de rassembler les paramètres dans une
classe :
struct Param
{
bool property1;
bool property2;
bool property3;
};
Fabien LE LEZ writes:
> On Mon, 30 Mar 2009 16:41:34 +0200, Alexandre Bacquart
> :
>>Et boycotter l'opérateur | ?
> Pour cette utilisation, oui.
Mais si tu vas par là:
class Patient {
void setTemperature(int temp);
};
comme on ne voudrait pas appeler
p.setTemperature(rand(MAX_INT)); (on voudrait une temperature
entière entre 20 et 46 "type safe"), on va devroir boycotter
C++ complètement puisqu'il ne connait pas les types
intervales.
Passons à ADA...
Fabien LE LEZ <grams...@gramster.com> writes:
> On Mon, 30 Mar 2009 16:41:34 +0200, Alexandre Bacquart
> <tek...@free.DELETEME.fr>:
>>Et boycotter l'opérateur | ?
> Pour cette utilisation, oui.
Mais si tu vas par là:
class Patient {
void setTemperature(int temp);
};
comme on ne voudrait pas appeler
p.setTemperature(rand(MAX_INT)); (on voudrait une temperature
entière entre 20 et 46 "type safe"), on va devroir boycotter
C++ complètement puisqu'il ne connait pas les types
intervales.
Passons à ADA...
Fabien LE LEZ writes:
> On Mon, 30 Mar 2009 16:41:34 +0200, Alexandre Bacquart
> :
>>Et boycotter l'opérateur | ?
> Pour cette utilisation, oui.
Mais si tu vas par là:
class Patient {
void setTemperature(int temp);
};
comme on ne voudrait pas appeler
p.setTemperature(rand(MAX_INT)); (on voudrait une temperature
entière entre 20 et 46 "type safe"), on va devroir boycotter
C++ complètement puisqu'il ne connait pas les types
intervales.
Passons à ADA...
Falk Tannhäuser a écrit :enum Properties
{
PROPERTY1 = 1<<0,
PROPERTY2 = 1<<1,
PROPERTY3 = 1<<2,
PROPERTY4 = 1<<3
};
inline Properties operator|(Properties a, Properties b)
{ // Note: Unary '+' forces integral promotion
return static_cast<Properties>(+a | +b);
}
Ca ne serait pas plus explicite d'utiliser static_cast<int> pour
la conversion en entier ? J'avoue que sans le commentaire, je
n'aurais pas compris tout de suite...
Falk Tannhäuser a écrit :
enum Properties
{
PROPERTY1 = 1<<0,
PROPERTY2 = 1<<1,
PROPERTY3 = 1<<2,
PROPERTY4 = 1<<3
};
inline Properties operator|(Properties a, Properties b)
{ // Note: Unary '+' forces integral promotion
return static_cast<Properties>(+a | +b);
}
Ca ne serait pas plus explicite d'utiliser static_cast<int> pour
la conversion en entier ? J'avoue que sans le commentaire, je
n'aurais pas compris tout de suite...
Falk Tannhäuser a écrit :enum Properties
{
PROPERTY1 = 1<<0,
PROPERTY2 = 1<<1,
PROPERTY3 = 1<<2,
PROPERTY4 = 1<<3
};
inline Properties operator|(Properties a, Properties b)
{ // Note: Unary '+' forces integral promotion
return static_cast<Properties>(+a | +b);
}
Ca ne serait pas plus explicite d'utiliser static_cast<int> pour
la conversion en entier ? J'avoue que sans le commentaire, je
n'aurais pas compris tout de suite...
On Mon, 30 Mar 2009 17:26:11 +0200, (Pascal J.
Bourguignon):
>comme on ne voudrait pas appeler p.setTemperature(rand(MAX_INT));
Pourquoi pas ?
rand(MAX_INT) renvoie, si je ne m'abuse, un entier supérieur ou égal à
zéro. Donc, une température physiquement atteignable.
Plus sérieusement, stocker un entier dans un "int", ça ne
prémunit pas contre les erreurs, mais au moins ça fait sens.
Stocker plusieurs booléens dans un "int", c'est un abus pur et
simple. Pour stocker plusieurs booléens, on utilise plusieurs
"bool", qu'on peut regrouper dans une classe si ça se
justifie.
On Mon, 30 Mar 2009 17:26:11 +0200, p...@informatimago.com (Pascal J.
Bourguignon):
>comme on ne voudrait pas appeler p.setTemperature(rand(MAX_INT));
Pourquoi pas ?
rand(MAX_INT) renvoie, si je ne m'abuse, un entier supérieur ou égal à
zéro. Donc, une température physiquement atteignable.
Plus sérieusement, stocker un entier dans un "int", ça ne
prémunit pas contre les erreurs, mais au moins ça fait sens.
Stocker plusieurs booléens dans un "int", c'est un abus pur et
simple. Pour stocker plusieurs booléens, on utilise plusieurs
"bool", qu'on peut regrouper dans une classe si ça se
justifie.
On Mon, 30 Mar 2009 17:26:11 +0200, (Pascal J.
Bourguignon):
>comme on ne voudrait pas appeler p.setTemperature(rand(MAX_INT));
Pourquoi pas ?
rand(MAX_INT) renvoie, si je ne m'abuse, un entier supérieur ou égal à
zéro. Donc, une température physiquement atteignable.
Plus sérieusement, stocker un entier dans un "int", ça ne
prémunit pas contre les erreurs, mais au moins ça fait sens.
Stocker plusieurs booléens dans un "int", c'est un abus pur et
simple. Pour stocker plusieurs booléens, on utilise plusieurs
"bool", qu'on peut regrouper dans une classe si ça se
justifie.
On Mon, 30 Mar 2009 20:07:41 +0200, Alexandre Bacquart
:
>C'est bien ça qui me dérange par rapport à la question qui était posée.
Guillaume demande en substance : "Je veux stocker des booléens
dans un int, est-ce une bonne idée ?"
Je lui réponds : non. Pour stocker des booléens, il faut
utiliser des "bool". Toute autre solution est purement et
simplement un abus, qui n'offrira alors aucune garantie.
On Mon, 30 Mar 2009 20:07:41 +0200, Alexandre Bacquart
<tek...@free.DELETEME.fr>:
>C'est bien ça qui me dérange par rapport à la question qui était posée.
Guillaume demande en substance : "Je veux stocker des booléens
dans un int, est-ce une bonne idée ?"
Je lui réponds : non. Pour stocker des booléens, il faut
utiliser des "bool". Toute autre solution est purement et
simplement un abus, qui n'offrira alors aucune garantie.
On Mon, 30 Mar 2009 20:07:41 +0200, Alexandre Bacquart
:
>C'est bien ça qui me dérange par rapport à la question qui était posée.
Guillaume demande en substance : "Je veux stocker des booléens
dans un int, est-ce une bonne idée ?"
Je lui réponds : non. Pour stocker des booléens, il faut
utiliser des "bool". Toute autre solution est purement et
simplement un abus, qui n'offrira alors aucune garantie.