type para libreria how example enum c++ c++11 initialization stdarray enum-class

c++ - para - how to use enum



Inicializar una matriz std:: bidimensional de tipo clase enum(C++ 11) (2)

Esto se puede hacer con un bucle for basado en rangos y la función std::array::fill member.

MyTable(EntryType value) { for (auto& row : _table) { row.fill(value); } }

Esto continuará funcionando incluso si cambia las dimensiones de la matriz.

Tengo la siguiente clase en C ++ 11:

class MyTable { public: enum class EntryType { USED, FREE }; MyTable(EntryType value) { for (uint32_t i = 0; i < 10; ++i) { memset(_table[i].data(), (int)value, sizeof(_table[0][0]) * 50); } } array<array<EntryType, 50>, 10> _table; }

Tratando de construir un objeto de MyTable con el valor de EntryType :: FREE, cada elemento de la matriz bidimensional tiene el valor de 0x01010101 (1b cada 8 bits), en lugar del valor esperado de solo 0x1.

Supongo que tiene algo que ver con que mi value se transfiera a int , pero no sé qué se supone que debo hacer para solucionarlo.


memset() se espera que funcione de esa manera, ya que es

establece cada byte del búfer de destino al valor especificado.

Lea más en ¿Por qué memset () inicializa incorrectamente int?

Sin embargo, tenga cuidado, ya que como dijo juanchopanza, std::array puede tener relleno al final (lea más en std :: alineación de matriz ), lo que significa que este enfoque podría fallar.

Como se trata de una matriz 2D, puede usar un bucle basado en rangos y std::array::fill , como este:

for(auto& row : _table) row.fill(value);

como dijo renzo.

En caso de que no desee configurar cada fila al mismo valor, puede hacerlo así, por supuesto:

for(auto &row : array) for(auto &col : row) col = value;

Obtenga más información en el rango para una matriz multidimensional .