2013-07-08 64 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.

相關問題