专业化模板类时的继承

icurays1

我希望能够做这样的事情:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章