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>。これは、要素が M 次元の multi_array である N 次元の multi_array にすぎません ...

このような型を生成するというアイデアは、Boost マニュアルの次の言葉に動機付けられています。

MultiArray は再帰的に定義されます。コンテナー階層モデル MultiArray の各レベルのコンテナーも同様です。実際、中間multi_arrayレベルの「要素」は 型であることがわかりますsubarray

有効な次元を持つ型subarrayを生成するために使用できますか? たぶん、次の行に沿ってどういうわけか:multi_arrayN+M

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

私は比較的クリーンな解決策 (長いハックではない) を探しています。これが multi_array インターフェイスで不可能な場合は、実装しようとしているものの設計を再考することをお勧めします。

4

1 に答える 1