可以在类层次结构中获取基类类型吗?获取类层次结构中类型的基类
例如:
struct A{};
struct B{} : public A;
struct C{} : public B;
我需要一些模板,将有typedef Base<T>::Type
里面是这样的:
Base<A>::Type == A
Base<B>::Type == A
Base<C>::Type == A
这可能吗?我有多重继承的情况怎么样?
可以在类层次结构中获取基类类型吗?获取类层次结构中类型的基类
例如:
struct A{};
struct B{} : public A;
struct C{} : public B;
我需要一些模板,将有typedef Base<T>::Type
里面是这样的:
Base<A>::Type == A
Base<B>::Type == A
Base<C>::Type == A
这可能吗?我有多重继承的情况怎么样?
我觉得std::is_base_of
可以帮你
#include <type_traits>
std::is_base_of<B, D>()
如果d从B处得到的,或者两者是相同的非工会类, 提供会员恒定值等于真。否则,值为 错误。
你可以用它来检查,如果一个类是基类的另一个与否:
std::is_base_of<A, A>() // Base<A>::Type == A
std::is_base_of<A, B>() // Base<B>::Type == A
std::is_base_of<A, C>() // Base<C>::Type == A
C++中的类可以拥有多个基类,因此没有必要具备“基于”基础的“特征”。
但是,TR2增加了新的编译器支持的特征std::tr2::bases
和std::tr2::direct_bases
,它返回基类的不透明类型列表。我不确定这是否会使它成为C++ 14,或者它是否会独立发布,但GCC已经seems to support this。
这可能是一个很好的办法做到这一点,这取决于你的使用情况。在基类本身中声明名为base
的基类的typedef。
然后派生类X
将继承它作为类型名称X::base
。
因此B::base
是A
和C::base
是A
。
struct A
{
typedef A base;
};
struct B : A {};
struct C : B {};
template<class X>
void f()
{
typename X::base x;
}
int main()
{
f<B>();
f<C>();
}
请阅读Kerrek SB回答以获得更好的参考:) – Felics 2013-04-28 19:56:50