提供维度后,boost :: extent对象的类型是什么?

时间:2017-10-05 22:43:41

标签: c++ boost boost-multi-array

说我有

#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);

使用autoboost::extents[3][4][5]分配给变量很容易,但我怎样才能具体地找出基础类型?

3 个答案:

答案 0 :(得分:4)

最重要的是,

  1. 您不必知道
  2. 您不必使用extents
  3. 只要满足documented criteria

    ,许多事情都是可以接受的

    enter image description here

    集合概念记录在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)

documentation提及:

  

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());

这消除了对增强范围的确切类型的依赖。