2012-11-07 66 views
0

私人部件I具有例如以下代碼:初始化的std ::陣列通過構造

#include <iostream> 
#include <array> 

class Base { 
public: 
    Base() : mA(std::array<int,2>()) {} 
    Base(std::array<int,2> arr) : mA(arr) {} 
    Base(/* what to write here ??? */); 
private: 
    std::array<int,2> mA; 
}; 

int main() 
{ 
    std::array<int,2> a = {423, 12}; // Works fine 
    Base b(a); // Works fine 
    Base c({10, 20}); // This is what I need. 

    return 0; 
} 

如何應該定義構造以允許初始化與內部「主」上面的第三行所示?一般來說,我需要一個可配置的(在編譯/運行時間的長度)結構,它允許使用數字列表(如{1,2,3}或(1,2,3)或類似的東西)進行初始化,而不需要元素 - 按元素複製。爲了簡單起見,我選擇了std :: array,但是恐怕它可能不適用於這種初始化。你會推薦什麼容器?

感謝, 克斯特亞

+0

我不認爲這是可能與使用'{'和'}'因爲這種類型的初始化它是一個語言特性而不是函數或其他東西,所以你不能「模擬」它 – SingerOfTheFall

+0

有趣的是,'Base c({10,20});'與GCC 4.8(不適用於4.7)和Clang 3.4一起工作。 – Ricky65

回答

5

你可以添加一個構造函數的std::initializer_list<int>和內容複製到陣列中:

#include <initializer_list> 
#include <algorithm> 

.... 

Base(std::initializer_list<int> a) { 
    // check size first 
    std::copy(a.begin(), a.end(), mA.begin()); } 
} 

注:如果你想持有定義了一些元素在運行時,那麼你應該使用一個std::vector<int>這有一個從initializer_list<int>構造函數,所以代碼更簡單:

class Foo { 
public: 
    Foo() {} 
    Foo(const std::vector<int>& arr) : mA(arr) {} 
    Foo(std::initializer_list<int> a) : mA(a) {} 
private: 
    std::vector<int> mA; 
}; 

您可以像這樣初始化:

Foo f1({1,2,3,4,5}); 

Foo f2{1,2,3,4,5}; 
+0

'mA'成員數組被固定爲'2'的大小,因此恕我直言,ctor必須檢查初始化程序列表是否是大小爲'2',或者只取第二個成員或進行其他檢查。如果'mA'的大小不足以適應初始化列表,那麼'std :: copy'會做什麼? –

+0

在這種情況下,我可以用數字列表{1,2,3}來初始化它嗎? – mkostya

+0

@mkostya你應該檢查initializer_list的siye是否與數組相同。在你的情況下,初始化3個元素是一個錯誤,因爲該數組的大小爲2. – juanchopanza