如何通过继承实现方法链接?
How to implement method chaining with inheritance?
我的问题是,当我已经使用了 Base
class 方法时,我无法从 Derived
class 链接方法。我试图混合来自 and CRTP and multilevel inheritance 的最高答案,但问题是其中一个总是返回相同的对象,另一个返回 void
。我希望 Base
class 能够被任何其他 class.
继承
[这个问题的天真的解决方案是使 a()
虚拟化并在 class Derived
中覆盖它。但是,如果 Base
被 100 个其他 class 继承并且有 100 个其他方法要覆盖怎么办?这不是很好的扩展。]
[另一个幼稚的解决方案是先从 Derived
class 调用方法,然后从 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);
}
}
};
之前,您可能会使用专业化。
我的问题是,当我已经使用了 Base
class 方法时,我无法从 Derived
class 链接方法。我试图混合来自 void
。我希望 Base
class 能够被任何其他 class.
[这个问题的天真的解决方案是使 a()
虚拟化并在 class Derived
中覆盖它。但是,如果 Base
被 100 个其他 class 继承并且有 100 个其他方法要覆盖怎么办?这不是很好的扩展。]
[另一个幼稚的解决方案是先从 Derived
class 调用方法,然后从 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);
}
}
};
之前,您可能会使用专业化。