2016-11-10 160 views
2

我可以初始化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這一問題,有助於?)

+0

你需要存儲的'0x00'字節?也許你可以使用'QByteArray :: QByteArray(const char * str)'構造函數? – wally

+0

是的,我需要所有的字節。 – KcFnMi

+3

'的QByteArray M_DATA( 「\ X0C \ X06 \ X04 \ X04 \ X02」,6)' –

回答

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})}; 
0

我正在尋找這樣的答案,但包括聲明的變量到表達式中;例如:

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功能。