gpt4 book ai didi

c++ - 强制调用所有基类中的方法

转载 作者:太空狗 更新时间:2023-10-29 21:16:17 26 4
gpt4 key购买 nike

如何实现一个为所有基类递归调用另一个方法的方法?概念上:

class C {
public:
magical void recursiveWork() {
thisClass::doWork();
if (baseClassExists) {
baseClass::recursiveWork();
}
}

void doWork() {
printf("bar");
}
}

class D : public C {
public:
void doWork() {
printf("foo");
}
}

D d;
d.recursiveWork(); // prints "foobar"

最佳答案

您可以使用一些东西来指示基类,例如下面的 base_type,然后递归检查 DoIt 是否存在。 (在这种情况下,我检查了 base_type 是否与 self 不同,以防最基类)。当然,它不适用于多重继承(它应该有一些东西来识别所有 base_type),并且在基类上进行对象切片时要小心。

#include <iostream>
#include <utility>

class A1
{
public:
using base_type = A1;
virtual ~A1(){}
virtual void DoIt(){ std::cout << "A1\n"; }
};

class A : public A1
{
public:
using base_type = A1;
virtual void DoIt(){
std::cout << "A\n";
}
};

class B : public A
{
public:
using base_type = A;
virtual void DoIt(){
std::cout << "B\n";
}
};

template<class...> using void_t = void;

template<class, class = void>
struct has_do_it : std::false_type { constexpr static bool value = false; };

template<class T>
struct has_do_it<T, void_t<decltype(std::declval<T&>().DoIt())>> : std::true_type { constexpr static bool value = true; };

template<typename T>
void DoItRec(T t)
{
if (has_do_it<T>::value) {
t.DoIt();
if(!std::is_same<T, typename T::base_type>::value)
{
typename T::base_type& base = t; // get base part (object slicing)
DoItRec(base);
}
}
}

int main()
{
B b;
DoItRec(b);
return 0;
}

Live example

关于c++ - 强制调用所有基类中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35554124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com