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 -

3 réponses

1 2 3 4
Avatar
Marc
Falk Tannhäuser wrote:

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);
}



Une question que je me pose (pas de standard sous la main cette semaine)
est de savoir si on a le droit d'utiliser des valeurs pour une enum plus
petites ou plus grandes que les valeurs extrêmes définies dans l'enum. En
particulier, serait-il mieux d'ajouter :
PROPERTY0=0 et PROPERTYMAX=1<<4-1 ?
Avatar
James Kanze
On Apr 2, 6:15 am, Marc wrote:
Falk Tannhäuser wrote:
> 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);
> }



Une question que je me pose (pas de standard sous la main
cette semaine) est de savoir si on a le droit d'utiliser
des valeurs pour une enum plus petites ou plus grandes que
les valeurs extrêmes définies dans l'enum.



Oui. La norme garantit toute valeur qui tiendra dans les
bits utilisés. Littéralement :

For an enumeration where e[min] is the smallest
enumerator and e[max] is the largest, the values of the
enumeration are the values of the underlying type in the
range bmin to bmax, where bmin and bmax are,
respectively, the smallest and largest values of the
smallest bit-field that can store e[min] and e[max].81)
It is possible to define an enumeration that has values
not defined by any of its enumerators.

L'utilisation des enum pour définir les champs de bits est trop
répandue et trop consacrée pour que ça ne marche pas.

Dans la pratique, évidemment, toute valeur qui tient dans le
type soujaçant fonctionnera.

En particulier, serait-il mieux d'ajouter :
PROPERTY0=0 et PROPERTYMAX=1<<4-1 ?



Ce n'est pas la peine.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
Marc
James Kanze wrote:

Une question que je me pose (pas de standard sous la main
cette semaine) est de savoir si on a le droit d'utiliser
des valeurs pour une enum plus petites ou plus grandes que
les valeurs extrêmes définies dans l'enum.



Oui. La norme garantit toute valeur qui tiendra dans les
bits utilisés. Littéralement :


[... du standard]

Merci :-)
1 2 3 4