有没有办法在C ++或C中枚举结构(struct | class)的成员?我需要获取成员名称,类型和值。我之前在一个小项目中使用了以下示例代码,其中变量是全局范围的。我现在遇到的问题是需要将一组值从GUI复制到对象,文件和VM环境。我可以创造另一个“穷人”的反思系统,或希望更好的东西,我还没有想到。有没有人有任何想法?
编辑:我知道C ++没有反射。union variant_t {
unsigned int ui;
int i;
double d;
char* s;
};
struct pub_values_t {
const char* name;
union variant_t* addr;
char type; // 'I' is int; 'U' is unsigned int; 'D' is double; 'S' is string
};
#define pub_v(n,t) #n,(union variant_t*)&n,t
struct pub_values_t pub_values[] = {
pub_v(somemember, 'D'),
pub_v(somemember2, 'D'),
pub_v(somemember3, 'U'),
...
};
const int no_of_pub_vs = sizeof(pub_values) / sizeof(struct pub_values_t);
答案 0 :(得分:4)
说明显而易见,C或C ++中没有反映。因此没有可靠的枚举成员变量的方法(默认情况下)。
如果您可以控制数据结构,可以尝试std::vector<boost::any>
或std::map<std::string, boost::any>
,然后将所有成员变量添加到矢量/地图中。
当然,这意味着您的所有变量都可能在堆上,因此这种方法会对性能产生影响。使用std :: map方法,这意味着你会有一种“穷人”的反思。
答案 1 :(得分:3)
您可以在中间文件中指定类型并从中生成C ++代码,可以从idl文件生成COM类。生成的代码为这些类型提供了反射功能。
我为不同的项目做了类似的两种不同的方式:
答案 2 :(得分:2)
Boost有一个可以满足您需求的Variant库。
答案 3 :(得分:2)
最简单的方法 - 切换到Objective-C或Objective-C ++。这些语言具有良好的内省性,并且与C / C ++源代码完全兼容。
你也可以使用m4 / cog / ...来实现同步生成结构以及来自某些元描述的描述。
答案 4 :(得分:0)
感觉就像是在构建某种调试器。我认为如果你确保在构建可执行文件时生成pdb文件,这应该是可行的。
不确定在什么上下文中你想要进行这个枚举,但在你的程序中,你应该能够从微软 dbghelp.dll 调用函数来从变量等获取类型信息。(我是假设您正在使用Windows,当然可能不是这样)
希望这有助于让你更进一步。
干杯!
答案 5 :(得分:0)
由于C ++没有内置反射,因此您只能获取有关结构内容的单独教学信息。
这可以通过从之后可以使用的格式生成结构来了解结构信息,也可以通过解析.h文件来提取结构信息。