如何调用所有基类的析构函数? (或通用功能)

时间:2019-04-26 15:54:16

标签: c++ templates derived-class

我想知道是否有任何优雅的方式做到这一点;

template<typename tType>
class A
{
   ...
};

class B : A<type1>, A<type2>, A<type3> ...
{
public:
  void CallBaseDestructors()
  {
    A<type1>::~A();
    A<type2>::~A();
    A<type3>::~A();
    ...

    //Or Something like that...

    A<type1>::DoSomething();
    A<type2>::DoSomething();
    A<type3>::DoSomething();
    ...
  }
};

它不必是析构函数。如果可以从A<>::Foo()调用类似B的函数,但不能对每个基数进行额外的调用(代码行)(循环也可以),也可以。

2 个答案:

答案 0 :(得分:4)

首先,您不应该像这样手动调用基类析构函数。调用析构函数是为了使“核心”工作与新的位置一起进行;您的示例是一个错误,因为您最终将“两次”破坏事物,并且您的程序具有未定义的行为。

问题的症结所在:如何在不编写所有基数的情况下,对所有基数重复某些给定的函数调用?恐怕您不能这样做(除非您从参数包继承)。 C ++没有 reflection ,否则可能会允许您遍历基类类型。

幸运的是,这是一件非常罕见的事情,即使那样,这么多的碱基也很少出现,因此重复几行是一个问题。而且,这里您还没有提供一个很好的案例。

答案 1 :(得分:0)

template<class ...tTypes>
class A;

template<>
class A<>
{
  void Reset()  {}
};

template<class tType, class ...tTypes>
class A<tType, tTypes...> : A<tTypes...>
{
  void Reset()
  {
    //Reset Impl for this type

    A<tTypes...>::Reset(); //And rest
  }
};

using tBase = A<type1, type2, type3, typeN>;

class B final : tBase 
{
};

那帮助了我。这是一个泛型类,它从每个基中调用Reset。 注意:代码为伪。 (需要公共关键字等)