Masque de bits de l'instruction switch

J'ai ce code dans un article de mon projet:

enum myEnum
{
    invalid = -1,
    val1 = 1,
    val2 = 2,
    val3 = 4
};

int bitmask = val1 | val3;

if(bitmask & val1)
    ...
if(bitmask & val2)
    ...
if(bitmask & val3)
    ...

Ce qui est bien, et ça fonctionne parfaitement, mais je me suis toujours demandé si cela pouvait être fait par un interrupteur. Je pensais à quelque chose le long des lignes de cette:

int checkMask(int& mask)
{
    for(int i = 0; mask; mask &= ~(1 << i++))
    {
        if(mask & (1 << i))
        {
            int ret = mask & (1 << i);
            mask &= ~ret;
            return ret;
        }
    }

    return invalid;
}

#define START_BITMASK_SWITCH(x) int xcopy = x; while(xcopy) { switch(checkMask(xcopy))
#define END_BITMASK_SWITCH };

int bitmask = val1 | val3;

START_BITMASK_SWITCH(bitmask)
{
    case val1:
        ...
        break;
    case val2:
        ...
        break;
    case val3:
        ...
        break;
}
END_BITMASK_SWITCH

donc mes questions sont:

  • ai-je viens de résoudre mon problème? je suppose que j'ai, mais c'est une solution propre?
  • est-il un moyen plus simple d'y parvenir?
  • est-ce une mauvaise idée de mélanger #définit et fonctions?

OriginalL'auteur Tom | 2011-07-07