我希望能够内省一个C++类的名称,内容(即成员及其类型)等.我在这里说的是原生C++,而不是托管C++,它有反射.我意识到C++使用RTTI提供一些有限的信息.哪些额外的库(或其他技术)可以提供此信息?
基本上,我想为跨多个头文件定义的一堆类自动向对象工厂注册对象创建者函数。
这篇文章的最佳答案提供了一个解决方案——但它不符合我的限制。
我正在处理现有的代码库。对于我需要注册的类,在类声明之后已经有一个宏,它将类作为参数。如果我能够扩展现有的宏定义以进行注册,那么它将节省大量时间,因为无需更改现有代码。
我能想到的最接近的解决方案是创建一个宏,该宏定义注册该对象的方法的模板特化,然后调用先前定义的模板特化方法——从而链接所有寄存器调用。然后,当我想注册所有类时,我只调用最近定义的专业化,它以#include 外观的相反顺序注册所有内容。
下面,我发布了一个简单的工作示例,显示了我迄今为止的解决方案。
唯一需要注意的是,我无法自动跟踪链中要调用的最后注册类型。所以我不断将#define LAST_CHAIN_LINK 重新定义为最近的专用类型名。这意味着我必须在每个现有的宏调用之后添加两行 #undef/#define —— 我真的很想避免这种情况。
主要问题:在下面的代码中,是否有任何方法可以定义 REGISTER_CHAIN 宏以在不使用 LAST_CHAIN_LINK #undef/#define 代码的情况下工作?
如果可以在 REGISTER_CHAIN 方法中重新定义 LAST_CHAIN_LINK 令牌就好了……
我的猜测是使用__COUNTER__预处理器功能可以实现一些解决方案,但这在目标平台之一(使用 gcc 4.2.x 的 OS X)上不可用,因此不是一个选项。
简化示例(在 GNU C++ 4.4.3 上编译):
#include <map>
#include <string>
#include <iostream>
struct Object{ virtual ~Object() {} }; // base type for all objects
// provide a simple create function to derived classes
template<class T> struct ObjectT : public Object {
static Object* create() { return new T(); } …Run Code Online (Sandbox Code Playgroud)