Инициализация QByteArray
Я могу инициализировать 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 ответов:
Вы можете позволить шаблону вычислить, сколько элементов находится в списке:
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})};
Я искал такой ответ, но включил в выражение объявленные переменные; например:
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;
Вот решение, которое я нашел:
char v1 = 0x06, v2 = 0x04; QByteArray ba(std::begin<char>({0x0c, v1, v2, v2, 0x02, 0x00, '\x8b'}), 7);
Используя функции std::begin или даже std::initializer_list C++11, этого можно достичь.
Comments