Champ de bits type safe

Le
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 -
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #19014021
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;
};
Alexandre Bacquart
Le #19014481
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
Fabien LE LEZ
Le #19014791
On Mon, 30 Mar 2009 16:41:34 +0200, Alexandre Bacquart

Et boycotter l'opérateur | ?



Pour cette utilisation, oui.
pjb
Le #19014771
Fabien LE LEZ
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__
Guillaume GOURDIN
Le #19015041
> 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...
Fabien LE LEZ
Le #19015691
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.
Alexandre Bacquart
Le #19016101
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
Fabien LE LEZ
Le #19016611
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.
Alexandre Bacquart
Le #19016601
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
Marc
Le #19016671
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 |.
Publicité
Poster une réponse
Anonyme