C ++ - это в основном надмножество C, но не всегда. В частности, хотя значения перечисления в C и C ++ неявно преобразуются в int, обратное неверно: только в C целые числа преобразуют обратно в значения перечисления. Таким образом, битовые флаги, определенные с помощью объявлений перечисления, работают неправильно. Следовательно, это нормально в C, но не в C ++:
typedef enum Foo
{
Foo_First = 1<<0,
Foo_Second = 1<<1,
} Foo;
int main(void)
{
Foo x = Foo_First | Foo_Second; // error in C++
return 0;
}
Как решить эту проблему эффективно и правильно, в идеале, без ущерба для дружественного к отладчику характера использования Foo в качестве типа переменной (он разлагается на битовые флаги компонента в часах и т.
Учтите также, что могут быть сотни таких перечислений флагов и многие тысячи точек использования. В идеале какая-то эффективная перегрузка оператора могла бы сделать свое дело, но это действительно должно быть эффективным; приложение, которое я имею в виду, предназначено для вычислений и имеет репутацию быстрого.
Пояснение: я перевожу большую (> 300 КБ) программу на C на C ++, поэтому я ищу эффективный перевод как во время выполнения, так и во время разработки. Простая вставка приведений во все подходящие места может занять несколько недель.