说我有
#include <boost/multi_array.hpp>
using intArray3D = boost::multi_array<int, 3>;
我想创建一堆具有相同形状的intArray3D
:
auto my_shape = boost::extents[3][4][5];
intArray3D xs(my_shape), ys(my_shape), zs(my_shape);
使用auto
将boost::extents[3][4][5]
分配给变量很容易,但我怎样才能具体地找出基础类型?
答案 0 :(得分:4)
最重要的是,
extents
只要满足documented criteria:
,许多事情都是可以接受的集合概念记录在that link
中<强> Live On Coliru 强>
#include <boost/multi_array.hpp>
#include <iostream>
using intArray3D = boost::multi_array<int, 3>;
void dump_shape(intArray3D const& arr) {
for (unsigned dim = 0; dim < arr.dimensionality; ++dim)
std::cout << arr.shape()[dim] << " ";
std::cout << "\n";
}
int main() {
{
auto my_shape = boost::extents[3][4][5];
intArray3D xs(my_shape), ys(my_shape), zs(my_shape);
dump_shape(xs); dump_shape(ys); dump_shape(zs);
}
{
std::array<int, 3> my_shape { 3, 4, 5 };
intArray3D xs(my_shape), ys(my_shape), zs(my_shape);
dump_shape(xs); dump_shape(ys); dump_shape(zs);
}
{
std::vector<int> my_shape { 3, 4, 5 };
intArray3D xs(my_shape), ys(my_shape), zs(my_shape);
dump_shape(xs); dump_shape(ys); dump_shape(zs);
}
}
打印
3 4 5
3 4 5
3 4 5
3 4 5
3 4 5
3 4 5
3 4 5
3 4 5
3 4 5
答案 1 :(得分:2)
template gen_type<Ranges>::type
- 此类型生成器用于指定
Ranges
的{{1}}链式调用的结果。
其中extent_gen::operator[]
是gen_type
的成员(boost::multi_array_types::extent_gen
也是全局帮助程序对象boost::multi_array_types::extent_gen
的类型。)
您还可以看到以这种方式指定接受一组扩展区的构造函数(至少为了公共文档的目的)。 For example,
boost::extents
...
namespace boost {
template <typename ValueType,
std::size_t NumDims,
typename Allocator = std::allocator<ValueType> >
class multi_array {
...
typedef multi_array_types::extent_gen extent_gen;
因此,您可以在不使用 explicit multi_array(extent_gen::gen_type<NumDims>::type ranges,
const storage_order_type& store = c_storage_order(),
const Allocator& alloc = Allocator());
的情况下重写代码行:
auto
这对于局部变量来说有点愚蠢,但是你可能希望在类或类似的东西中存储一组范围。如果是这样,这是根据官方记录的界面进行的方式。
(如注释中所述,此typedef解析为涉及boost::multi_array_types::extent_gen::gen_type<3>::type my_shape =
boost::extents[3][4][5];
的实际类型,但您不应在代码中使用“内部”命名空间中的任何内容,因为在将来的版本中可能会发生更改。)
答案 2 :(得分:0)
我会存储
template<class T>
using factory=std::function< T() >;
然后当我想创建许多数组时:
auto my_shape = boost::extents[3][4][5];
factory<intArray3D> shaper = [my_shape]{ return intArray3D(my_shape); };
intArray3D xs(shaper()), ys(shaper()), zs(shaper());
这消除了对增强范围的确切类型的依赖。