2013-07-08 40 views
1

我有一个模板类,做一些计算和返回的multi_array,有点简单化这样的:嵌套boost :: 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元件...

想法产生这种类型由升压手动说法动机

MultiArray是递归定义的;容器层次模型MultiArray也在每个级别的容器中。 事实上,事实证明,中级multi_array级别的“元素”类型为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; 

我在寻找一个相对干净的解决方案(而不是冗长的黑客),如果这是不可能的multi_array的接口,我会更好地重新思考什么我设计即将实施。

回答

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有根据的T类型的额外维度。帮助函数get_rank检查T是否为multi_array并返回其dimensionality,否则返回0.

相关问题