枚举可执行文件C++派生类

Enumerating derived classes in C++ executable

本文关键字:派生 C++ 可执行文件 枚举      更新时间:2023-10-16

假设您的C++应用程序中有基类和多个派生类。您希望枚举从此基派生的所有类而不实例化派生类,例如在类名列表框中向用户显示它们。显然,所需的信息在应用程序中的某个地方。如何检索它?

您可以添加静态注册器元素。像这样:

Base.hpp:

#include <string>
#include <typeindex>
#include <unordered_map>
using typemap = std::unordered_map<std::type_index, std::string>;
struct Base
{
    /* ... */
    static typemap & registry();
};
template <typename T> struct Registrar
{
    Registrar(std::string const & s) { Base::typemap()[typeid(T)] = s; }
};

基.cpp:

#include "Base.hpp"
typemap & Base::registry() { static typemap impl; return impl; }

DerivedA.hpp:

#include "Base.hpp"
struct DerivedA : Base
{
    static Registrar<DerivedA> registrar;
    /* ... */
};

DerivedA.cpp:

#include "DerivedA.hpp"
Registrar<DerivedA> DerivedA::registrar("My First Class");

现在,在main()启动后的任何时间,您都可以调用Base::registry()来获取对映射的引用,该映射每个派生类包含一个元素。

这是不可能的。大多数情况下,您不知道运行时中的类名,也无法获取类的列表。如果您不想实例化所有需要的类,唯一的选择是手动构建列表。