2

私が直面している問題では、多態的なクラスのように機能するが、仮想テンプレートメソッドを可能にするものが必要です。

ポイントは、サブ問題の配列を作成し、それぞれが異なるクラスで実装された異なる手法によって解決されるが、同じインターフェイスを保持し、一連のパラメーターを渡すことです (関数/ファンクターです-これはテンプレートはすべての下位問題にジャンプして、解決策を取得します。

パラメータがたとえば int の場合、これは次のようになります。

struct subproblem
{
...
virtual void solve (double& solution, double parameter)=0; 
}
struct subproblem0: public subproblem
{
...
virtual void solve (double& solution, double parameter){...}; 
}
struct subproblem1: public subproblem
{
...
virtual void solve (double* solution, double parameter){...}; 
}

int main{
subproblem problem[2];
subproblem[0] = new subproblem0();
subproblem[1] = new subproblem1();
double argument0(0),
       argument1(1),
       sol0[2],
       sol1[2];
for(unsigned int i(0);i<2;++i)
    {
    problem[i]->solve( &(sol0[i]) , argument0);
    problem[i]->solve( &(sol1[i]) , argument1);
    }
return 0;
}

しかし問題は、引数が次のようになる必要があることです

Arg<T1,T2> argument0(f1,f2)

したがって、解決方法は次のようなものになります

template<T1,T2> solve (double* solution, Arg<T1,T2> parameter)

これは明らかに仮想と宣言できません(したがって、基本クラスへのポインターから呼び出すことはできません)...

今、私はかなり立ち往生しており、続行する方法がわかりません...

4

2 に答える 2

1

通常、このタイプの問題は、パブリック関数テンプレートと、型消去オブジェクトを取り込む保護された仮想関数によって解決されます。特定の問題については、これは次のように変換できます。

struct param_list_base {
  virtual double getParam(int i) const = 0;
};

template <typename ParamStorage>
struct param_list : param_list_base {
  const ParamStorage& params;
  param_list(const ParamStorage& aParams) : params(aParams) { };
  virtual double getParam(int i) const {
    return params[i];
  };
};

class subproblem {
  protected:
    virtual void solve_impl(double* sol, param_list_base* params) = 0;
  public:
    template <typename ParamStorage>
    void solve(double* sol, ParamStorage params) {
      param_list<ParamStorage> tmp(params);
      solve_impl(sol, &tmp);
    };
};

param_list次に、さまざまな種類のパラメーター ストレージ オブジェクト用にテンプレートを特殊化することもできます。ファンクタについても、同じことができます。もちろん、これはいくらか制限されていますが、通常、ほとんどの場合に機能させることができます。それ以外の場合でも、保護された関数とパブリック関数の同様のパターンに依存できます。たとえば、パブリック インターフェイスに一連の非テンプレート仮想関数を含めることができます。これらはすべて、プライベート関数テンプレートを呼び出すだけです (すべてのケースで 1 つの実装)。これはきれいではありませんが、可能なテンプレートの数が引数は限られています。

于 2012-09-07T15:54:29.287 に答える
0

抽象基本クラスを宣言し、テンプレートにそれを継承させます。

于 2012-09-07T15:43:20.117 に答える