假设您的 C++ 应用程序中有基类和几个派生类。您想枚举从该基类派生的所有类而不实例化派生类,例如在类名列表框中将它们呈现给用户。显然,所需的信息在应用程序的某个地方。如何找回它?
问问题
1584 次
2 回答
7
您可以添加静态注册器元素。像这样:
基础.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; }
派生A.hpp:
#include "Base.hpp"
struct DerivedA : Base
{
static Registrar<DerivedA> registrar;
/* ... */
};
派生A.cpp:
#include "DerivedA.hpp"
Registrar<DerivedA> DerivedA::registrar("My First Class");
现在,在main()
开始后的任何时候,您都可以调用Base::registry()
以获取对每个派生类包含一个元素的映射的引用。
于 2012-05-14T19:44:00.440 回答
1
这是不可能的。大多数情况下,您不知道运行时的类名,也无法获取类列表。如果您不想实例化所有需要的类,唯一的选择是手动构建列表。
于 2012-05-14T19:30:17.543 回答