Большая часть кода в компании, в которой я работаю, часто использует типы знаков без знака для небольших чисел, чтобы избежать нежелательного заполнения в структурах данных.Я редко вижу проблему с этим, однако я столкнулся с небольшой проблемой с неявным преобразованием при установке флагов ошибок с побитовыми операторами.Я нашел обходной путь, просто явный, но мне было интересно, есть ли более элегантный способ.Кстати, мы компилируем с помощью c ++ 11
Учитывая код ошибки enum ниже:
enum ErrorType : unsigned char
{
OK. = 0x00,
ERROR01 = 0x01,
ERROR02 = 0x02
};
и предполагая, что у меня есть некоторые классы с закрытыми членами типа errorType, которые будут использовать открытые члены для установки илиснять флажки, например:
struct S
{
public:
void setError1();
void unsetError1();
private:
ErrorType errorType;
};
Если я попытаюсь неявно установить значения ниже:
void S::setError1()
{
this->errorType |= ERROR01;
}
Я получу ошибки преобразования типов
, однако, если я приведу явное приведениепобитовое преобразование работает
this->errorType = ErrorType(this->errorType | ERROR01);
Может показаться, что проблема в том, что выходные данные побитовых преобразований всегда целочисленные и не обязательно отражают тип ввода.Это правда?и если да, есть ли способ указать тип для него, чтобы мне не приходилось каждый раз явным образом приводить?