【问题标题】:Nesting boost::multi_array?嵌套 boost::multi_array?
【发布时间】:2013-07-08 10:29:47
【问题描述】:

我有一个模板类,它进行一些计算并返回 multi_array,有点过于简单了:

template <typename T>
class C
{
public:
    typedef boost::multi_array<T, 2> result_type;

    void do_something(T const& data, unsigned i, unsigned j); // add result to R[i][j]

    result_type R;
};

使用简单类型 T=double 实例化类可以正常工作。现在,我想用“T=boost::multi_array&lt;double, 1&gt;”进行实例化,但结果类型为boost::multi_array&lt;double, 3&gt;

multi_array&lt;multi_array&lt;T, N&gt;, M&gt;&gt; 的定义显然不会导致 multi_array&lt;T, N+M&gt;,它只是一个 N 维 multi_array,其中元素是 M 维 multi_arrays ...

生成这种类型的想法是由 Boost 手册中所说的

MultiArray 是递归定义的;每个级别的容器 容器层次模型 MultiArray 也是如此。 实际上,中间multi_array 级别的“元素”是subarray 类型。

可以使用subarray 生成具有有效维度N+Mmulti_array 类型吗?也许以某种方式遵循以下思路:

typedef typename boost::multi_array<double, 3>::subarray<1>::type value_type;
boost::multi_array<value_type, 2> a;

我正在寻找一个相对干净的解决方案(不是冗长的 hack),如果使用 multi_array 接口无法做到这一点,我会更好地重新考虑我将要实现的设计。

【问题讨论】:

    标签: c++ boost-multi-array


    【解决方案1】:

    我认为用multi_array 类型的元素实例化multi_array 是没有意义的(尽管它可能会编译)。例如,它不会导致连续的内存布局,因为元素自己管理内存。

    为了解决引发我的问题的问题,我想出了以下解决方案:

    template <typename T>
    class C
    {
        enum { extra_rank = get_rank<T>() };
    public:
        typedef boost::multi_array<T, 2 + extra_rank> result_type;
    }
    

    该类根据T 的类型定义了带有额外维度的multi_array。辅助函数get_rank检查T是否为multi_array并返回其dimensionality,否则返回0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 2023-03-06
      • 2011-07-31
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      相关资源
      最近更新 更多