在我遇到的问题中,我需要的东西或多或少像多态类,但是它允许使用虚拟模板方法。
重点是,我想创建一个子问题数组,每个子问题都是通过在不同类中实现的不同技术解决的,但是保持相同的接口,然后传递一组参数(函数/函子 - 这是模板跳转到所有子问题的地方,并找回解决方案。
如果参数是例如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)
显然不能声明为虚拟(因此无法从指向基类的指针调用)...
现在我很困难,不知道如何处理...
答案 0 :(得分: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 :(得分:0)
声明一个抽象基类,让你的模板继承。