c++ - 继承通用成员函数

标签 c++ c++17 crtp member-functions

我正在尝试将模板化成员函数的定义和声明从基类转移到派生类。要注意的是,这些函数中的某些行为取决于类,基本上是静态多态性。我被推荐使用 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> 的类型.有什么办法可以解决这个问题。我只是想避免必须重新声明/重新定义所有类中的所有成员函数。就自由函数而言,我只是将它们模板化,但成员函数已被证明是一个问题。

我已经根据 Brian 的建议更新了我的问题。请注意,多重继承会导致关于应该调用哪个函数的歧义——来自 CRTP<DerivedDerived<T>> 的函数。或来自 Derived<T> 的那个:

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

最佳答案

您需要一个派生自 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> > 
{};

关于c++ - 继承通用成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57098298/

相关文章:

c++ - 虚拟继承是否增加开销

c++ - 智能指针 : Does a 'base' part of an object get created?

c++ - 为什么 std::filesystem 提供这么多非成员函数?

c++ - 警告 : linker path does not have real file for library -lpthread

c++ - 使用 "if constexpr"防止元组越界

c++ - 将集合的第一个第 n 个值复制到 C++ 中的 vector 的简单方法

C++ CRTP 和不完整的类定义

c++ - 绑定(bind)到可变成员函数

c++ - CRTP 和多级继承

c++ - 避免通过操作从私有(private)构造函数间接实例化