微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过继承实现方法链?

如何解决如何通过继承实现方法链?

我的问题是,当我已经使用 Derived方法时,我无法从 Base链接方法。我试图混合来自 Returning a reference to the derived class from a base class methodCRTP and multilevel inheritance 的最高答案,但问题是其中一个总是返回相同的对象,另一个返回 void。我希望 Base 类能够被任何其他类继承。

[这个问题最简单的解决方案是将 a() 设为虚拟并在类 Derived 中覆盖它。但是,如果 Base 被 100 个其他类继承并且有 100 个其他方法要覆盖怎么办?这不是很好的扩展。] [另一个简单的解决方案是先从 Derived调用方法,然后从 Base 调用方法,但是...只是没有]

那么,是否有可能以某种方式在本机 C++ 中编译以下代码片段? (我对提升解决方案不感兴趣)。如果 main()代码不会改变,那就太理想了。

#include <iostream>
#include <type_traits>

template <typename T = void>
class Base
{
public:
    T& a();
 };

class Derived : public Base<Derived>
{
public:
    Derived& b() {std::cout << "b\n"; return *this;}
};


int main()
{
    Base base;
    base
        .a()
    ;
    
    Derived derived;
    derived
        .a()
        .b()
    ;
    
    return 0;
}

template <typename T>
T& Base<T>::a()
{
    std::cout << "a\n";
    if(std::is_same<T,void>::value)
    {
        return *this;
    }
    else
    {
        return static_cast<T&>(*this);
    }
}

如果我能写template <typename T = Base> class Base { ... :)

解决方法

不确定它是否是您想要的,但使用 C++17 和 if constexpr,您可能会这样做:

template <typename T = void>
class Base
{
public:
    auto& a()
    {
        std::cout << "a\n";
        if constexpr (std::is_same_v<T,void>) {
            return *this;   
        } else {
            return static_cast<T&>(*this);
        }
    }
};

Demo

以前,您可能会使用专业化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。