1

整数パラメーターを持つテンプレート クラスがありますが、実行時のテンプレート パラメーターしかわかりません。実行時にテンプレート クラスを作成するためのベスト プラクティスはありますか?

私が思いついた解決策は、テンプレートクラスの抽象基本クラスを作成することです。これは、インターフェイスを提供し、テンプレートクラスを作成して基本クラスの型のポインターに格納するアダプタークラスを持ちます。

class MyInterface {
    virtual void doSomething(...) = 0;
}

template <int T>
class MyTemplateClass : public MyInterface {
    void doSomething(...) { ... };
}

class TemplateAdapter {
    MyInterface* template_class;

    Template(int n) {
        switch(n) {
          case 1:
            template_class = new MyTemplateClass<1>();
            break;
          case 2:
            template_class = new MyTemplateClass<2>();
            break;
          case 3:
            template_class = new MyTemplateClass<3>();
            break;
          [...]
        }
    }

   void doSomething() {
       template_class->doSomething();
   }
}

これは機能し、正しい結果が得られますが、非常に遅いです。アダプターを使用すると、テンプレート クラスを使用するよりもほぼ 2 倍遅くなります。多少遅くする必要があることは明らかですが、これは予想よりもはるかに遅いです。

このパフォーマンスの大幅な低下はどこから来るのでしょうか? また、よりパフォーマンスの高いテンプレート クラスを動的に作成する方法を知っていますか?

どんな助けでも大歓迎です!ありがとう、ペドロ

4

4 に答える 4

0

この設計では、コンパイラは何もインライン化できず (コンパイル時に実際の型がわかっている場合は仮想呼び出しを削除できます)、実際にインスタンス化されるクラスの実行時の決定が必要になります。

于 2013-09-23T03:36:45.837 に答える
0

C++ のテンプレートはコンパイル時にのみ存在します。この理由により、テンプレートを動的に生成しようとすると失敗します。

ランタイム スイッチを削除し、アダプターをテンプレートにすることで、コードを最適化できます。

template<int i>
class TemplateAdapter {
    MyTemplateClass<i> template_class;

}

しかし、これによりアダプターの必要性がなくなります。

于 2013-09-23T03:38:46.350 に答える