是否可以在运行时从 c++ 类声明中知道继承的数量?

Posted

技术标签:

【中文标题】是否可以在运行时从 c++ 类声明中知道继承的数量?【英文标题】:Is it possible to know the number of inheritances from a c++ class declaration at runtime? 【发布时间】:2019-09-12 10:00:33 【问题描述】:

鉴于这些类示例,

class A ;
class B : A ;
class C ;
class D : A, C ;
class E : D ;

该函数应将 A 类的继承数返回为 0,而对于 B、C、D 和 E 类,该函数应分别返回 1、0、2、1。

注意:函数不应该考虑整个继承 类(例如,E 采用从 A 和 C 继承的 D 间接地,所以它会有 3 但就我而言,我想知道这个数字 声明中类的继承)

【问题讨论】:

Afaik C++ 不支持这种反射特性。您必须自己实现某种计数器。 有一个针对std::direct_bases的提案,但拒绝了what-is-the-status-of-n2965-stdbases-and-stddirect-bases 我能想到的最接近的事情是在编译时使用std::is_base_of 你为什么需要这个? 这是不可能的。不幸的是,C++ 不能以这种方式工作。 【参考方案1】:

很遗憾,这还没有进入语言。有std::direct_bases提案被拒绝:What is the status of N2965 - std::bases and std::direct_bases?

所以你需要自己动手——有很多方法可以解决这个问题,但例如可能是这样的:

#include <tuple>

    class A
        public:
      using bases = std::tuple<>;
    ;

    class B:A
        public:
      using bases = std::tuple<A>;
    ;

    class C
        public:
      using bases = std::tuple<>;
    ;

    class D:A,C
        public:
      using bases = std::tuple<A,C>;
    ;

    class E:D
        public:
      using bases = std::tuple<D>;
    ;

    template <class T>
    size_t count_bases() 
        return std::tuple_size<typename T::bases>::value;
    

    int main() 
      return count_bases<D>();//returns '2'
    

自己试试吧:https://godbolt.org/z/u0qoZa

【讨论】:

谢谢。不幸的是,这不符合我的需要。我需要某种自动程序来避免修改所有类。遗憾的是 std::bases 和 std::direct_bases 被拒绝了。我想知道是否有一种方法可以检测一个类是否具有多继承性,而不是知道一个类的继承数。 @JordiEspada 没有你身边的一些工作是不可能的(给定当前的语言) - 你也可以建立一个'你感兴趣'的所有类型的列表(由于在实践中这是不可能的模板类) - 然后使用 en.cppreference.com/w/cpp/types/is_base_of 检查列表

以上是关于是否可以在运行时从 c++ 类声明中知道继承的数量?的主要内容,如果未能解决你的问题,请参考以下文章

C++父类中声明了一个虚函数以后 是否在子类 以及子类的子类中 都要声明并重写这个函数?

在运行时从 MFC 中的派生类中添加控件

在 C++ 中使用多继承声明接口并实现接口

C++ 继承:我必须在派生类中重复父属性吗?

c++面向对象的程序设计

C++学习19 类的多继承