QByteArray初始化

时间:2016-11-10 18:48:27

标签: qt c++11 qt5 c++14 c++17

我可以初始化QByteArray,如:

QByteArray m_data;
m_data[0] = 0x0c;
m_data[1] = 0x06;
m_data[2] = 0x04;
m_data[3] = 0x04;
m_data[4] = 0x02;
m_data[5] = 0x00;

但我想要更紧凑的东西,比如:

QByteArray m_data{0x0c, 0x06, 0x04, 0x04, 0x02, 0x00};

不幸的是,不允许使用此表单:

error: could not convert '{12, 6, 4, 4, 2, 0}' from '<brace-enclosed initializer list>' to 'QByteArray'
     QByteArray m_data{0x0c, 0x06, 0x04, 0x04, 0x02, 0x00};
                                                          ^

有没有其他选择(更接近我的梦想)?

(C ++ 11/14/17有助于解决这个问题吗?)

2 个答案:

答案 0 :(得分:1)

您可以让模板找出列表中有多少元素:

using myarr = char[];

template <size_t N>
QByteArray make_QByteArray(const char(&a)[N]) {
    return {a,N};
}

然后使用:

创建QByteArray
auto  m_data{make_QByteArray(myarr{0x0c, 0x06, 0x04, 0x04, 0x02, 0x00})};

答案 1 :(得分:1)

我一直在寻找这样的答案,但是将声明的变量包含在表达式中;例如:

#define countColors(x) SomeClass::countColors(x)

以下是我找到的解决方案:

char       v1 = 0x06, v2 = 0x04;
QByteArray m_data;

m_data[0] = 0x0c; m_data[1] =  v1 ; m_data[2] = v2 ;
m_data[3] =  v2 ; m_data[4] = 0x02; m_data[5] = 0x00;
//And a character higher than 0x7f
m_data[6] = 0x8b;

使用std::begin甚至std::initializer_list C ++ 11功能可以实现这一目标。