首页 > 解决方案 > 继承泛型成员函数

问题描述

我正在尝试将模板化成员函数的定义和声明从基类转移到派生类。问题是这些函数中的某些行为取决于类,基本上是静态多态性。有人建议我使用 CRTP,它在大多数情况下都很好用。但是,如果我想从一个已经从我的 CRTP 基类继承的类继承我有一个问题。考虑以下代码:

template<typename Derived>
struct CRTP
{
    template<typename TypeRHS>
    Derived& operator+=(const TypeRHS& rhs) 
    {
        // do something
        return static_cast<Derived&>(*this);
    }
};

template<typename T>
struct Derived : public CRTP<Derived<T>> {};

template<typename T>
struct DerivedDerived : public Derived<T> {};

如果我调用它+=DerivedDerived<T>它将返回一种Derived<T>. 有没有办法可以解决这个问题。我只是想避免重新声明/重新定义所有类中的所有成员函数。就自由函数而言,我只是对它们进行了模板化,但成员函数已被证明是一个问题。

我已经用布赖恩的建议更新了我的问题。请注意,多重继承会导致关于应该调用哪个函数的歧义 - 一个 fromCRTP<DerivedDerived<T>>或一个 from Derived<T>

template<typename T>
struct DerivedDerived : public Derived<T>, public CRTP<DerivedDerived<T>> {};

标签: c++c++17crtpmember-functions

解决方案


您需要一个派生自 Derived 的 CRTP,以供 DerivedDerived 使用

template<typename T>
struct CRTP
{
    template<typename TypeRHS>
    T& operator+=(const TypeRHS& rhs) 
    {
        // do something
        return static_cast<T&>(*this);
    }
};

template<typename T>
struct Derived : public CRTP<Derived<T>> {
};

template<typename T>
struct CRTPForDerived : public Derived<T>
{
    template<typename TypeRHS>
    T& operator+=(const TypeRHS& rhs) 
    {
        // do something
        return static_cast<T&>(*this);
    }
};

template<typename T>
struct DerivedDerived : public CRTPForDerived<DerivedDerived<T> > 
{};

推荐阅读