1

我有一个模板类,它进行一些计算并返回 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<double, 1>”实例化,但是结果类型是boost::multi_array<double, 3>.

该定义multi_array<multi_array<T, N>, M>>显然不会导致multi_array<T, N+M>,它只是一个 N 维 multi_array 元素是 M 维 multi_arrays ...

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

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

可以使用subarray生成multi_array具有有效维度的类型N+M吗?也许以某种方式沿着以下几行:

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

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

4

1 回答 1

0

我认为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;
}

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

于 2013-07-11T10:26:13.317 回答