我希望能够做这样的事情:
template<typename T>
class myClass{
public:
double Foo(double x){return x;}
}
template<>
class myClass<SpecialType>{
public:
double Bar(double x){return x+1.0;}
}
现在,我想实例化专门化,但是仍然可以访问该方法Foo
而无需在专门化中重新编写整个内容,即:
myClass<SpecialType> A;
double y = A.Foo(1.0);
有没有办法在当前设置下执行此操作,还是需要编写一个“ master”类以进行继承Foo()
?
两种选择(在其他几种选择中):
构造一个公共基类,在其中放置所有与类型无关的东西(推荐):
struct myClassBase
{
virtual double Foo(double x) const {return x+1.0;}
};
template<typename T> struct myClass : public myClassBase
{
//...
};
template<>
struct myClass<SpecialType> : public myClassBase
{
double Bar(double x){return x+1.0;}
}
特别是在您的功能不依赖于模板参数的情况下,建议这样做。
从您的非专业班级派生:
template<>
struct myClass<SpecialType> : public myClass</* be careful what to write here */>
{
double Bar(double x){return x+1.0;}
}
但是,您必须小心,将哪种类型传递给非专业的类模板(尤其是当您的成员函数取决于模板类型时,它们应该以某种方式有意义)。
另一个更静态的选择是应用策略模式:将所有功能转移到一些小的策略类中,然后通过组合这些类来构建所需的类(缺点:您必须再次公开这些函数),或者通过多个继承(在此操作)不必重述整个内容,但要再次注意避免歧义)。
编辑:根据您的评论,这是针对同一任务的CRTP方法:
template<typename Derived>
struct myClassBase
{
double Foo(double x) const
{
return static_cast<Derived const&>(*this).specialMember(x);
}
//all other stuff independent of the derived class specialization
//possibly define specialMember once:
virtual double specialMember(double x) const { return x; }
}
template<typename T> struct myClass : public myClassBase<myClass<T> >
{
//... special member of Base class is sufficient
};
template<> struct myClass<SpecialType> : public myClassBase<myClass<SpecialType> >
{
virtual double specialMember(double x) const { return x+1.0; }
};
同样,请注意,只有在函数评估中确实包含模板类型时,这才有意义。
另一方面,如果重载就double Foo(double x)
足够了,则请忘记整个模板内容,并使用第一个替代方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句