是否可以在运行时从 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++ 类声明中知道继承的数量?的主要内容,如果未能解决你的问题,请参考以下文章