0

私はEigenを線形代数パッケージとして使用しています。そこでは、固定サイズの行列タイプがあり、次のように定義されています。

template<class TNumber, size_t N, size_t M>
class Matrix
{...}

したがって、ベクトルと正方行列のみを使用しているため、ほとんどのクラスは同様のテンプレートになりました。

template<size_t K>
class MyClass {...}

次元Kは、実際にはファイルからロードされたデータに依存します。これらのテンプレートを動的サイズKでインスタンス化する合理的な方法はありますか、それともswitchステートメントが必要ですか?

switch(dim) {
case 1: MyClass<1>...
case 2: MyClass<2>...

default: //too much data
}

4

2 に答える 2

1

テンプレートは、実行時ではなくコンパイル時にインスタンス化されます。したがって、ランタイム データに基づいてテンプレートをインスタンス化することはできません。

于 2013-03-19T19:10:08.467 に答える
0

次元数に上限がある場合は、プロキシ クラスを作成して次元をインデックスにマップし、代わりにインデックスを使用できます。それはきれいな解決策ではありませんが、うまくいくかもしれません。

  class Proxy{
  protected:
        OpaqueAllocator *allocators[10];
  public:
        Proxy(){
             allocators[0] = new SpecializedAllocator<0>();
             allocators[1] = new SpecializedAllocator<1>();
             allocators[...] = new SpecializedAllocator<...>();
             allocators[9] = new SpecializedAllocator<9>();
        }

        static OpaqueAllocator* getAllocator(const size_t index){ return allocators[index]; }
  };

  // usage:
  int test = 2;
  // allocate a two dimensional array:
  Container *c = Proxy::getAllocator(test)->allocate();

主な問題は、メイン コンテナーに不透明なクラスが必要なことです。バックグラウンドでタイプ セーフを維持することはできますが、読みやすさは少し低下します。

于 2013-03-19T19:18:28.353 に答える