如何调用所有 base class 的析构函数? (或一个共同的功能)

How to call all base class destructors? (or a common function)

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

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();
    ...
  }
};

它不必是析构函数。如果可以从 B 调用像 A<>::Foo() 这样的函数,但不能为每个碱基额外调用(代码行)(循环是好的),这也是可以的。

首先,您不应该像那样手动调用基本 class 析构函数。调用析构函数是为了 "hardcore" 与 placement new 一起工作;你的例子是一个错误,因为你最终会破坏东西 "twice" 并且你的程序有未定义的行为。

关于问题的症结所在:如何对所有基重复一些给定的函数调用,而不是将它们全部写出来?恐怕你不能(除非你从参数包继承)。 C++ 没有 反射,否则它可能允许您遍历基 class 类型。

幸运的是,很少有人想做这件事,即便如此,也很少有 如此多的碱基,以至于一些重复的行是个问题。而且,再一次,你在这里没有提出一个很好的案例。

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 
{
};

这对我很有帮助。它是一个通用的 class,它从每个碱基调用 Reset。 注意:代码是伪造的。 (需要public个关键字等)