枚举结构的成员?

时间:2009-05-20 15:12:27

标签: c++ c enumeration

有没有办法在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);

6 个答案:

答案 0 :(得分:4)

说明显而易见,C或C ++中没有反映。因此没有可靠的枚举成员变量的方法(默认情况下)。

如果您可以控制数据结构,可以尝试std::vector<boost::any>std::map<std::string, boost::any>,然后将所有成员变量添加到矢量/地图中。

当然,这意味着您的所有变量都可能在堆上,因此这种方法会对性能产生影响。使用std :: map方法,这意味着你会有一种“穷人”的反思。

答案 1 :(得分:3)

您可以在中间文件中指定类型并从中生成C ++代码,可以从idl文件生成COM类。生成的代码为这些类型提供了反射功能。

我为不同的项目做了类似的两种不同的方式:

  • 由Ruby脚本解析的自定义文件,用于生成
  • 将类型定义为C#类型,使用C#的反射来获取所有信息并从中生成C ++(听起来很复杂,但效果非常好,编写类型定义与编写C ++定义非常相似)

答案 2 :(得分:2)

Boost有一个可以满足您需求的Variant库。

答案 3 :(得分:2)

最简单的方法 - 切换到Objective-C或Objective-C ++。这些语言具有良好的内省性,并且与C / C ++源代码完全兼容。

你也可以使用m4 / cog / ...来实现同步生成结构以及来自某些元描述的描述。

答案 4 :(得分:0)

感觉就像是在构建某种调试器。我认为如果你确保在构建可执行文件时生成pdb文件,这应该是可行的。

不确定在什么上下文中你想要进行这个枚举,但在你的程序中,你应该能够从微软 dbghelp.dll 调用函数来从变量等获取类型信息。(我是假设您正在使用Windows,当然可能不是这样)

希望这有助于让你更进一步。

干杯!

答案 5 :(得分:0)

由于C ++没有内置反射,因此您只能获取有关结构内容的单独教学信息。

这可以通过从之后可以使用的格式生成结构来了解结构信息,也可以通过解析.h文件来提取结构信息。