2012-11-07 26 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