Существует еще один способ, расширяющий ответ @bitmask:
Предположим, есть фиксированное количество критериев, которые вы можете проверить. Таким образом, вместо использования битовой маски для значений fruit_and_vegetables
enum (что ограничит вас размером слова), вы можете использовать дополнительные LUT:
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
...
};
так что проверка на определенный классификатор станет
if (qualifs_LUT[tomato] & is_tasty)
РЕДАКТИРОВАТЬ : и еще один интересный метод. Рассмотрим (снова) метод @bitmask :. Это зависит от степени 2. Но как насчет простых чисел? Они растут намного медленнее, поэтому, присваивая простые числа перечислимым значениям, вы можете вычислить большее количество значений, предполагая, что продукт не переполнится:
enum fruit_and_vegetables {
apples = 2,
pears = 3,
tomatoes = 5,
cucumbers = 7
}
if ((apples * pears * tomatoes) % tomatoes == 0)
printf("it's tasty!");
этот ограничивает количество элементов в наборе управления.