获取类层次结构中类型的基类

Mir*_*pas 13 c++ c++11

是否可以在类层次结构中获取基类类型?

例如:

struct A{};
struct B{} : public A;
struct C{} : public B;
Run Code Online (Sandbox Code Playgroud)

我想要一些typedef Base<T>::Type内部像这样的模板:

Base<A>::Type == A
Base<B>::Type == A
Base<C>::Type == A
Run Code Online (Sandbox Code Playgroud)

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

Ker*_* SB 21

C++中的类可以有多个基类,所以没有任何意义可以让"让我成为基础"特征.

然而,TR2新增功能包括新的编译器支持的特性std::tr2::basesstd::tr2::direct_bases,返回基类的不透明类型列表.

我不确定这是否会进入C++ 14,或者它是否会独立发布,但GCC 似乎已经支持了这一点.

  • @Felics作为一个旁边,未来两者都描述了你的*真正*问题和你尝试的解决方案所遇到的问题.虽然堆栈溢出在阅读思想方面是不错的,但如果它不需要它会更好! (6认同)
  • @Felics怎么能不接受这个答案呢?你的问题不是"B"是否确实是"D"(映射到bool)的基础,而是"B"是从(一对多映射)派生的"D". (3认同)

And*_*zos 8

这可能是一个很好的方法,具体取决于您的用例。声明base在基类本身中命名的基类的 typedef 。

然后派生类X将继承它作为 typename 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>();
}
Run Code Online (Sandbox Code Playgroud)


mas*_*oud 7

我想std::is_base_of可以帮到你

#include <type_traits>

std::is_base_of<B, D>()
Run Code Online (Sandbox Code Playgroud)

如果D派生自B或两者都是相同的非联合类,则提供成员常量值等于true.否则值为false.

您可以使用它来检查某个类是否是另一个类的基类:

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
Run Code Online (Sandbox Code Playgroud)