1

C++ で画像処理アプリケーションを作成しています。イメージ タイプを定義するために、ブースト マルチ アレイ、ブースト ublas マトリックス、または Eigen 2D マトリックスのいずれかを使用することを検討しています。私が行おうとしているすべてのさまざまな操作について、これらを慎重にベンチマークし、それに応じて 1 つを選択したいと思います。

しかし、開発を中断する余裕はありません。したがって、画像タイプの定義を ublas、Eigen、または multiarray から別のものに簡単に交換できるようにコードを書き始めたいと思います。これらのライブラリでは要素アクセサー演算子が異なるため、typedef がここで私を救うとは思いません。

たとえば、3 つのライブラリのそれぞれで次のように 2D 配列 'myArray' の要素にアクセスします。 Boost multiarray : myArray[x][y] Boost ublas : myArray (x,y)

[][] と ( _ 、 _ ) の要素へのアクセス方法の間に競合があることがわかります。したがって、単純な typedef を使用して、ある型のコードを記述し、別の型で動作させることはできません。

これを回避する方法はありますか?

基になる型を、アクセス方法を標準化する新しいユニバーサル型にラップすることを考えています。その後、typedef を使用して、ある型を別の型に簡単に交換できます。心配すべき落とし穴はありますか? それは私に多くの効率を要しますか?ここで最も活用できる言語機能は何ですか?

始めるのを手伝っていただければ、コードを書いてここに貼り付けて、さらに確認します。PS 私はこれら 3 つのタイプの豊富な API を使用していません。私は単にそれらを作成し、それらの要素にアクセスしています。

4

2 に答える 2

4

この場合、プロキシ パターンを使用します。プロキシを簡単にラップして、基になるオブジェクトを使用する一意のインターフェイスを定義するだけです。お役に立てれば....

編集:

このリンクも役立つはずだと思います: Template Proxy

于 2014-06-29T08:10:13.043 に答える
0

効率を下げたくない場合は、定義を使用できます。

typedef boost::multiarray MyArray ;
#define GET_AT(a,i,j) a[i][j]

次に、型を切り替えるときにtypedefandを変更するだけです。defineテンプレート関数 (または適切なオーバーロード関数) を実行することもできます。

template <class Array>
inline ... getAt (Array <...> const& a, int i, int j) { return a[i][j] ; }

inline ... getAt (2DMatrix <...> const& a, int i, int j) { return a(i,j) ; }

とにかく、クラスを単一のインターフェースにラップしたい場合は、適切な最適化を使用することで、効率が低下しないことが保証されると思います。

于 2014-06-29T08:14:42.030 に答える