在类的构造函数初始化器中填充std::array

5

有没有一种方法可以在类的构造函数初始化程序中填充std :: array

现在我正在以冗长的方式填充它:

class Matrix3x3 {
//...
private:
    std::array<double, 9> _indicies;
};
//...
Matrix3x3::Matrix3x3(double m00, double m01, double m02, double m10, double m11, double m12, double m20, double m21, double m22) : _indicies() {
    _indicies[0] = m00; _indicies[1] = m01; _indicies[2] = m02;
    _indicies[3] = m10; _indicies[4] = m11; _indicies[5] = m12;
    _indicies[6] = m20; _indicies[7] = m21; _indicies[8] = m22;
}

Visual Studio 2010不支持完整的c++11(仍将std::array列为typedef到std ::tr1::array命名空间!)。

尝试包括:

1. Matrix3x3::Matrix3x3(const std::initializer_list<std::array<double, 9> >& row_column_values) : _indicies(row_column_values) { }
2. Matrix3x3::Matrix3x3(double m00, double m01, double m02, double m10, double m11, double m12, double m20, double m21, double m22) : _indicies({m00, m01, m02, m10, m11, m12, m20, m21, m22}) { }

所有这些都不适用于VS2010。它们全部都报告错误:

1. error C2664: 'std::tr1::array<_Ty,_Size>::array(const std::tr1::array<_Ty,_Size> &)' : cannot convert parameter 1 from 'const std::initializer_list<_Elem>' to 'const std::tr1::array<_Ty,_Size> &'
2. Cascading errors:
    error C2059: syntax error : ')'
    error C2143: syntax error : missing ')' before '{'
    error C2143: syntax error : missing ';' before '}'
    error C2447: '{' : missing function header (old-style formal list?)

使用构造函数初始化列表。 - chris
2
考虑让您的构造函数接受一个std::initializer_list。 - John Zwinck
3个回答

3
在C++11中,你可以使用花括号初始化器,就像这样:
Matrix3x3::Matrix3x3(double m00, double m01, double m02, double m10, double m11, double m12, double m20, double m21, double m22)
:   _indicies({m00, m01, m02, m10, m11, m12, m20, m21, m22}) {
}

点此查看在ideone上的演示。


周围的括号不应该在那里。如果我能找到支持我的某些东西,尽管Clang会抱怨。 - chris
@chris 如果没有大括号,代码将无法编译 - 这里是我尝试在ideone上删除花括号的链接(http://ideone.com/sG9qR4)。 - Sergey Kalinichenko
除非我只是在考虑普通数组。这很可能是情况。似乎我的Clang投诉的声明仅适用于普通数组。它仍然可以编译没有括号和std::array,但对于那个有括号的情况没有警告。 - chris
1
@Casey,这是因为VS 2010不支持C++11,并且目前还不清楚他们是否有计划在最新版本的工具中添加支持 - 即使是与最新和最伟大的版本一起提供的C++编译器。这真的很不幸 :-( - Sergey Kalinichenko
将此选为答案是因为它对未来可能会问这个问题的使用vs2012(2013?)及更高版本的人们有帮助。 - Casey
显示剩余2条评论

0
这对我有效:
array<int, 4> arr;
arr = {1,2,3,4};

也许将您的代码更改为:

Matrix3x3::Matrix3x3(double m00, double m01, double m02, double m10, double m11, double m12, double m20, double m21, double m22) : _indicies({m00, m01, m02, m10, m11, m12, m20, m21, m22}) {}

我在发布和获取答案之间已经尝试过这个,但在 VS2010 中无效(请参见 dasblinkenlight 的答案)。 - Casey

0

这是一个通用的构造函数

template<typename... A>
Matrix3x3(A&&... a) : _indicies{{std::forward<A>(a)...}} { }

这将接受最多9个初始值,这些初始值可以隐式转换为double(除了缩小转换),就像std::array<double, 9>聚合初始化一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接