我正在为一些数据std::array<std::array<double,3>,4> a
编写接口。我希望能够将数据解释为Eigen::Map<Eigen::Vector3d>
的std::array
。如果我没有默认的初始值设定项,如何初始化std::array
?基本上,数组必须在构造函数中的 {} 之前构建。
class Interface{
Interface( std::array<std::array<double,3>,4>& a ) :
data_( a[0].data() ), // this works for initializing just the one
array_of_data_( /* what goes here? */ ) {}
protected:
Eigen::Map<Eigen::Vector3d> data_;
std::array<Eigen::Map<Eigen::Vector3d>,4> array_of_data_;
}
包含示例data_
是为了演示从单个std::array<double,3>
构建一个地图。
显而易见的方法是重复 4 次in[index].data()
因为数组获取的所有元素:
class Interface {
public:
Interface( std::array<std::array<double,3>,4>& a ) :
data_( a[0].data() ), // this works for initializing just the one
array_of_data_{ Eigen::Map<Eigen::Vector3d>(a[0].data()),
Eigen::Map<Eigen::Vector3d>(a[1].data()),
Eigen::Map<Eigen::Vector3d>(a[2].data()),
Eigen::Map<Eigen::Vector3d>(a[3].data()) }
{}
但是,如果数组的第二维具有更大的价值,则可能会很乏味。
您可以使用std::index_sequence
和包扩展来缩短它:
template<size_t D1, size_t D2, size_t ... idx>
auto makeMap(
std::array< std::array<double,D1>, D2>& in,
std::index_sequence<idx...> seq)
{
return std::array< Eigen::Map<Eigen::Vector3d>, D2>{
Eigen::Map<Eigen::Vector3d>(in[idx].data())...
};
}
template<size_t D1, size_t D2, size_t ... idx>
auto makeMap( std::array< std::array<double,D1>, D2>& in) {
return makeMap(in, std::make_index_sequence<D2>());
}
编译器资源管理器上的工作版本