Есть ли способ заполнить 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?)
В 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}) {
}
Это работает для меня:
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}) {}
Вот общий конструктор
template<typename... A>
Matrix3x3(A&&... a) : _indicies{{std::forward<A>(a)...}} { }
который будет принимать не более 9 инициализаторов, которые неявно преобразуются в double
(кроме сужения), точно так же, как std::array<double, 9>
«s агрегатно-инициализация.