Oui, je sais, je n'ai pas "avoir" à faire de cette façon. Mais j'ai l'habitude d'écrire:
/* Return type (8/16/32/64 int size) is specified by argument size. */
template<class TYPE> inline TYPE BIT(const TYPE & x)
{ return TYPE(1) << x; }
template<class TYPE> inline bool IsBitSet(const TYPE & x, const TYPE & y)
{ return 0 != (x & y); }
E. g.:
IsBitSet( foo, BIT(3) | BIT(6) ); // Checks if Bit 3 OR 6 is set.
Entre autres choses, cette approche:
- Accueille 8/16/32/64 bits entiers.
- Détecte IsBitSet(int32,int64) appelle à mon insu et consentement.
- Inline Modèle, donc pas d'appel de fonction frais généraux.
-
const& références, donc rien de besoins pour être dupliqué, copié. Et nous sommes assurés que le compilateur va ramasser toutes les typo que de tenter de modifier les arguments.
-
0!= rend le code plus clair et évident. Le principal point à l'écriture de code est toujours à communiquer clairement et efficacement avec les autres programmeurs, y compris ceux de moindre compétence.
- Tout n'est pas applicable à ce cas particulier... En général, basées sur des modèles de fonctions d'éviter la question de l'évaluation des arguments à plusieurs reprises. Un problème connu avec certains #définir des macros.
E. g.: #define ABS(X) (((X)<0) ? - (X) : (X))
ABS(i++);