我想知道是否有任何优雅的方式做到这一点;
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
的函数,但不能对每个基数进行额外的调用(代码行)(循环也可以),也可以。
答案 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。 注意:代码为伪。 (需要公共关键字等)