5

有没有办法在 C++ 或 C 中枚举结构(结构 | 类)的成员?我需要获取成员名称、类型和值。我之前在一个变量是全局范围的小项目中使用过以下示例代码。我现在遇到的问题是需要将一组值从 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);
4

6 回答 6

4

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

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

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

于 2009-05-20T15:21:54.357 回答
3

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

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

  • 由 Ruby 脚本解析的自定义文件以进行生成
  • 将类型定义为 C# 类型,使用 C# 的反射获取所有信息并从中生成 C++(听起来很复杂,但效果出奇的好,编写类型定义与编写 C++ 定义非常相似)
于 2009-05-21T11:09:15.203 回答
2

Boost 有一个随时可用的Variant库,可以满足您的需求。

于 2009-05-20T15:22:13.170 回答
2

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

你也可以使用 m4/cog/... 来同时生成结构和他从一些元描述中的描述。

于 2009-05-21T10:53:13.583 回答
0

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

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

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

干杯!

于 2009-05-20T15:28:28.947 回答
0

由于 C++ 没有内置反射,因此您只能获取有关结构内容的信息,分别教您的程序。

这可以是通过从一种格式生成结构,之后您可以使用该格式来了解结构信息,或者通过解析 .h 文件来提取结构信息。

于 2009-05-21T11:26:52.953 回答