如何用模板方法(c++)模拟类中的多态性

How to mimic polymorphism in classes with template methods (c++)?

本文关键字:模拟类 多态性 c++ 何用 模板方法      更新时间:2023-10-16

在我面临的问题中,我需要一个或多或少像多态类一样工作的东西,但它允许使用虚拟模板方法。

关键是,我想创建一组子问题,每个子问题都通过在不同的类中实现的不同技术来解决,但拥有相同的接口,然后将一组参数(即函数/函子-这是模板跳起来的地方)传递给所有子问题,并返回解决方案。

如果参数是,例如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)

它显然不能被声明为虚拟的(所以不能从基类的指针调用)。。。

现在我很困,不知道该怎么办。。。

通常,这类问题可以通过公共函数模板和接受类型擦除对象的受保护虚拟函数来解决。对于您的特定问题,这可以转化为:

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

声明一个抽象基类,并让模板从中继承。