Vous pouvez mettre en œuvre une machine d'état à la place:
#define COMBINATION(a,b,c,d) (((a)<<3)|((b)<<2)|((c)<<1)|((d)<<0))
switch (COMBINATION(conditionX,conditionY,condition1,condition2))
{
case COMBINATION(0,0,0,0): break;
case COMBINATION(0,0,0,1): break;
case COMBINATION(0,0,1,0): break;
case COMBINATION(0,0,1,1): break;
case COMBINATION(0,1,0,0): break;
case COMBINATION(0,1,0,1): CodeY2(); break;
case COMBINATION(0,1,1,0): CodeY1(); break;
case COMBINATION(0,1,1,1): CodeY1(); break;
case COMBINATION(1,0,0,0): break;
case COMBINATION(1,0,0,1): CodeX2(); break;
case COMBINATION(1,0,1,0): CodeX1(); break;
case COMBINATION(1,0,1,1): CodeX1(); break;
case COMBINATION(1,1,0,0): break;
case COMBINATION(1,1,0,1): CodeX2(); break;
case COMBINATION(1,1,1,0): CodeX1(); break;
case COMBINATION(1,1,1,1): CodeX1(); break;
}
Cela comprend une seule branche de l'opération, de sorte qu'il est peut-être un peu plus efficace (même si elle inclut également un autre moteur d'exécution de calcul (à l' switch
ligne)).
Pour être plus propre, je suppose que c'est une question de point de vue, mais le modèle ci-dessus vous donne également un bon moyen de détecter tous les non gérée branches au sein de votre code.
Veuillez noter que si toutes les variables de condition peut avoir une valeur autre que 1 ou 0, alors vous devriez:
#define COMBINATION(a,b,c,d) (((a)?8:0)|((b)?4:0)|((c)?2:0)|((d)?1:0))
Mise à jour (attribué à @Jonathan Wakely dans un des commentaires ci-dessous):
Si vous êtes à l'aide de C++11, alors vous pouvez remplacer l' COMBINATION
macro avec un constexpr
fonction de:
constexpr int COMBINATION(bool a,bool b,bool c,bool d)
{
return ((int)a<<3) | ((int)b<<2) | ((int)c<<1) | ((int)d<<0);
}