初始化类型为枚举类的二维std ::数组(C ++ 11)

时间:2017-05-26 09:05:16

标签: c++ c++11 initialization stdarray enum-class

我在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;
}

尝试使用EntryType :: FREE的值构造MyTable的对象,二维数组中的每个项的值都为0x01010101(每8位1b),而不是仅为0x1的预期值

我猜这与value被投放到int有关,但我不知道为了修复它我应该做些什么。

2 个答案:

答案 0 :(得分:6)

memset()预计会以这种方式运作,因为它是

  

将目标缓冲区的每个字节设置为指定值。

Why is memset() incorrectly initializing int?

中了解详情

但是,要小心,因为正如juanchopanza所说,std::array最后可能有填充(在std::array alignment中阅读更多内容 ),这意味着这种方法可能会失败。

由于它是一个2D数组,你可以使用基于范围的for循环和std::array::fill,如下所示:

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

如仁佐所说。

如果您不想将每一行设置为相同的值,您当然可以这样做:

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

range-based for on multi-dimensional array中阅读更多内容。

答案 1 :(得分:3)

这可以通过基于范围的for循环和std::array::fill成员函数来完成。

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

即使您更改了数组尺寸,这仍将继续有效。