Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Champ de bits type safe

33 réponses
Avatar
Guillaume GOURDIN
Bonjour à tous,

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?

Merci pour vos réflexions.

- Guillaume -

10 réponses

1 2 3 4
Avatar
Fabien LE LEZ
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;
};
Avatar
Alexandre Bacquart
Fabien LE LEZ wrote:
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;
};



Et boycotter l'opérateur | ?


--
Alex
Avatar
Fabien LE LEZ
On Mon, 30 Mar 2009 16:41:34 +0200, Alexandre Bacquart
:

Et boycotter l'opérateur | ?



Pour cette utilisation, oui.
Avatar
pjb
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...

--
__Pascal Bourguignon__
Avatar
Guillaume GOURDIN
> 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...



Si vraiment on voulait être type safe, on pourrait créer une classe
'temperature' avec un seul 'int' à l'intérieur...
Avatar
Fabien LE LEZ
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.
Avatar
Alexandre Bacquart
Fabien LE LEZ wrote:
On Mon, 30 Mar 2009 16:41:34 +0200, Alexandre Bacquart
:

Et boycotter l'opérateur | ?



Pour cette utilisation, oui.



C'est bien ça qui me dérange par rapport à la question qui était posée.


--
Alex
Avatar
Fabien LE LEZ
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.
Avatar
Alexandre Bacquart
Fabien LE LEZ wrote:
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.



J'entends bien, mais je me demandais s'il n'y avait pas quelque-chose,
comme un template, qui permettrait de profiter de la sémantique très
claire des l'opérateur | dans la situation indiquée par l'OP.


--
Alex
Avatar
Marc
Fabien LE LEZ wrote:

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.



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 |.
1 2 3 4