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

时间:2012-05-14 19:23:56

标签: c++ derived

假设您的C ++应用程序中有基类和几个派生类。 您希望枚举从此基础派生的所有类,而不实例化派生类,比如在类名列表框中将它们呈现给用户。显然,所需的信息在应用程序中的某个位置。如何检索?

2 个答案:

答案 0 :(得分:5)

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

<强> Base.hpp:

#include <type_index>
#include <unordered_map>
#include <string>

typedef std::unordered_map<std::type_index, std::string> typemap;

struct Base
{
    /* ... */
    static typemap & registry();
};

template <typename T> struct Registrar
{
    Registrar(std::string const & s) { Base::typemap()[typeid(T)] = s; }
};

<强> Base.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()来获取对每个派生类包含一个元素的地图的引用。

答案 1 :(得分:1)

无法做到。大多数情况下,您通常不了解运行时的类名,也无法获取类的列表。如果您不想实例化所有需要的类,唯一的选择是手动构建列表。