如何调用所有 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个关键字等)
我想知道是否有任何优雅的方法可以做到这一点;
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个关键字等)