2

在我面临的问题中,我需要一些或多或少类似于多态类的东西,但它允许虚拟模板方法。

关键是,我想创建一个子问题数组,每个子问题都通过在不同类中实现的不同技术解决,但保持相同的接口,然后传递一组参数(它们是函数/函子 - 这就是模板跳转)到所有子问题并获得解决方案。

如果参数是,例如,整数,这将是这样的:

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模板专门用于不同类型的参数存储对象。对于函子,您也可以这样做。当然,这在一定程度上是有限的,但它通常可以在大多数情况下工作。否则,您仍然可以依赖类似的受保护函数与公共函数模式。例如,您可以在公共接口中拥有一组非模板虚函数,它们都只是调用一个私有函数模板(所有情况下的一个实现),这并不漂亮,但如果可能的模板数量多,它就可以工作论据有限。

于 2012-09-07T15:54:29.287 回答
0

声明一个抽象基类,并让您的模板继承自它。

于 2012-09-07T15:43:20.117 回答