如何用模板方法(c++)模拟类中的多态性
How to mimic polymorphism in classes with template methods (c++)?
在我面临的问题中,我需要一个或多或少像多态类一样工作的东西,但它允许使用虚拟模板方法。
关键是,我想创建一组子问题,每个子问题都通过在不同的类中实现的不同技术来解决,但拥有相同的接口,然后将一组参数(即函数/函子-这是模板跳起来的地方)传递给所有子问题,并返回解决方案。
如果参数是,例如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
模板。对于函子,也可以这样做。当然,这在一定程度上是有限的,但它通常可以在大多数情况下发挥作用。否则,您仍然可以依赖类似的受保护函数与公共函数模式。例如,你可以在公共接口中有一组非模板虚拟函数,它们都只调用一个私有函数模板(所有情况下都有一个实现),这并不好看,但如果可能的模板参数数量有限,它就可以工作。
声明一个抽象基类,并让模板从中继承。
相关文章:
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 从基类调用函数的多态性
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 如何在 c++ 中使用多态性访问派生类字段?
- C++多态性:如何测试一个类是否派生自另一个基类
- 具有 3 级继承的基类shared_ptr的多态性
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 在同时处理基类的多个指针时如何处理多态性?
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?
- 多态性中独立类的基本误差.C++
- C 中的多态性.在基类上调用继承的方法
- 相互关联的C 类中多态性的最佳实践
- 将多态性与运算符 + 重载模板化类结合使用.如何实现基类?
- 在 PHP 中不使用父类时是否称为多态性
- C++模板方法重载和具有多态性的类访问
- CRTP 静态多态性:是否可以用模拟替换基类
- 如何用模板方法(c++)模拟类中的多态性
- 类多态性和相等运算符
- 无法从指针派生类转换为指针基类(多态性)
- 告诉编译器子类-多态性