Типизация C ++ с побитовой операцией присваивания - PullRequest
0 голосов
/ 17 декабря 2018

Я не нашел способа привести тип, где задействована побитовая операция присваивания (например, x | = y & z;).

Пример:

#include <stdio.h>

typedef enum type1{
    AA = 0,
    BB = 1
} type1_e;

int main()
{

  type1_e x,y;

  y = type1_e(y | x); //working

  y |= (type1_e)(y|x); //ERROR: as.cc:15: error: invalid conversion from ‘int’ to ‘type1_e’

}

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018
  • Вы можете написать перегрузку для побитового ИЛИ (|), которая работает для вашего перечисления.
  • Вам также потребуется использовать static_cast для правильного преобразования.

#include<iostream>
using namespace std;

typedef enum type1{
    AA = 0,
    BB = 1
} type1_e;

type1_e operator |=(type1_e& x, type1_e y)
{
    return x=static_cast<type1_e>(static_cast<int>(x) | static_cast<int>(y));
}


int main()
{
  type1_e x = AA, y = BB;
  y = type1_e(y | x); //working
  std::cout << y << '\n';

  x = AA, y = AA;
  y |= static_cast<type1_e>(y|x); //also works
  std::cout << y << '\n'; 

}

См. demo .

0 голосов
/ 17 декабря 2018

operator | дает int результат

type1_e(y | x)

y | x равен int.Вы явно приводите, что int на type1_e.


y |= (type1_e)(y|x);

эквивалентно

y = y | type1_e(y | x);

Вы используете operator |, что дает intрезультат, затем пытается присвоить это y, что type1_e.Вы не можете сделать это без приведения.


Чтобы преодолеть это, вы можете сделать это:

y = type1_e(y | type1_e(y | x));

, что аналогично:

y = type1_e(y | y | x);

который совпадает с:

y = type1_e(y | x);

или:

  y = static_cast<type1_e>(y | x);
...