2013-04-28 67 views
12

可以在类层次结构中获取基类类型吗?获取类层次结构中类型的基类

例如:

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 

这可能吗?我有多重继承的情况怎么样?

回答

6

我觉得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 
+2

请阅读Kerrek SB回答以获得更好的参考:) – Felics 2013-04-28 19:56:50

19

C++中的类可以拥有多个基类,因此没有必要具备“基于”基础的“特征”。

但是,TR2增加了新的编译器支持的特征std::tr2::basesstd::tr2::direct_bases,它返回基类的不透明类型列表。我不确定这是否会使它成为C++ 14,或者它是否会独立发布,但GCC已经seems to support this

+21

你所有的基地都属于'std :: bases' ... – jrok 2013-04-28 11:26:23

+0

这是一种类型特质,如果没有编译器魔法就无法实现,是吗? – jrok 2013-04-28 12:13:32

+0

这是更适合我的问题,但我接受了其他答案,因为与std ::条件相结合,它解决了我的问题。 – Felics 2013-04-28 12:21:05

4

这可能是一个很好的办法做到这一点,这取决于你的使用情况。在基类本身中声明名为base的基类的typedef。

然后派生类X将继承它作为类型名称X::base

因此B::baseAC::baseA

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