枚举可执行文件C++派生类
Enumerating derived classes in C++ executable
假设您的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()
来获取对映射的引用,该映射每个派生类包含一个元素。
这是不可能的。大多数情况下,您不知道运行时中的类名,也无法获取类的列表。如果您不想实例化所有需要的类,唯一的选择是手动构建列表。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 存储模板类型以强制转换回派生<T>
- 需要从 istream 和 ostream 派生 iostream
- 在 C++ 中用派生类型重写成员函数
- 具有多个类、派生类的C++正向声明
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 如果基类包含双指针成员,则派生类的构造函数
- 为什么此派生对象无法访问基类的后递减方法?
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践