Как перечисления битовых флагов C должны быть переведены в C ++?

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 ++, поэтому я ищу эффективный перевод как во время выполнения, так и во время разработки. Простая вставка приведений во все подходящие места может занять несколько недель.

Ответы на вопрос(3)

Ваш ответ на вопрос