Hay otra manera, que se extiende la respuesta de @bitmask:
Supongamos que hay un número fijo de criterios que se puede comprobar. Así, en lugar de utilizar máscara de bits para los valores de fruit_and_vegetables
enumeración (que se limite al tamaño de la palabra), puede utilizar LUT adicional:
enum fruit_and_vegetables {
apples = 0,
pears,
tomatoes,
cucumbers
}
enum qualifs {
is_fruit = 1,
is_sweet = 1<<1,
is_round = 1<<2,
is_tasty = 1<<3
}
const qualifs qualifs_LUT[] = { // can be generated
is_fruit | is_sweet | is_round, // apple
...
};
modo que comprobar que existe una voluntad de clasificación específica se convirtió
if (qualifs_LUT[tomato] & is_tasty)
EDIT: y otro método interesante. Considere (nuevamente) el método @bitmask: Se basa en poderes de 2. Pero, ¿qué tal primos? Ellos crecen mucho más lentamente, por lo que mediante la asignación de números primos a los valores de enumeración, se puede squize más valores, asumiendo que el producto no se derrame:
enum fruit_and_vegetables {
apples = 2,
pears = 3,
tomatoes = 5,
cucumbers = 7
}
if ((apples * pears * tomatoes) % tomatoes == 0)
printf("it's tasty!");
éste es limitar el número de elementos del conjunto de control.
tomates y pepinos * * son fruto ;-P –
no según la Escoto: http://en.wikipedia.org/wiki/Tomato#Fruit_or_vegetable.3F –
@Noah: '' tomates son * y no 'tomates es *' – ruslik