通过变量名迭代struct

dbe*_*m22 6 c++ iteration reflection iterator c-preprocessor

更新:6个月后,我刚刚遇到了这样的答案:索引结构是否合法?:Slava回答.我认为这是一个比这里提供的更好的解决方案,因为绝对没有未定义的行为.希望这对下一个人有所帮助,因为对我来说已经太晚了.


在您发表评论告诉我使用数组或向量或任何形式的容器之前,这是一个我不能做的事实.我知道,这将通过数组来解决,否则任何解决方案都非常"hacky".我很想用一个容器,但我绝对不能.

我是一家非常大的公司的中级开发人员,我们正在使用公司范围的库来通过以太网发送数据.有多种原因可以解释为什么它不能支持数组/向量,而是使用POD结构(普通旧数据 - 字符,浮点数,整数,粗体).我从一个浮点数开始,我必须使用它来填充具有相同浮点数的结构.由于这个库的目的是通过以太网发送消息,我只需要进行两次迭代 - 一次在发送上,一次在接收上.所有其他时间,此数据存储为数组.我知道 - 我应该将数组序列化并按原样发送,但我再说一遍 - 我绝对不能.

我有一个float[1024],必须遍历数组并填充以下结构:

struct pseudovector
{
    float data1;
    float data2;
    float data3;
    ...
    float data1024;
}
Run Code Online (Sandbox Code Playgroud)

我已经使用BOOST_PP_REPEATBOOST_PP_SEQ_FOR_EACH_I生成了这个结构,这样我就不必写出所有1024个浮点数,并且它增加了可维护性/可扩展性.

以同样的方式,我尝试通过预编译器##连接(/sf/answers/2031466041/)迭代结构,但由于这是在预编译时完成的,因此不能用于运行 - 获取/设置时间.

我已经研究过如何实现反射,例如如何向C++应用程序添加反射?Ponder Library,但这两种方法都要求您明确写出可以反映的每个项目.在这种情况下,我不妨std::map<string, float>通过字符串/整数连接在for循环中创建并迭代:

for(i=0;i<1024;i++)
{
    array[i] = map.get(std::string("data")+(i+1))
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以推荐一个更清洁的解决方案,不需要我写出超过1024行代码?非常感谢您的帮助!

我再说一遍 - 我绝对不能使用任何类型的数组/向量.

And*_*rew 9

这可能比您预期的要容易.首先,一些警告:

  1. 按标准,阵列保证是连续的; 也就是说,它们之间没有插入填充,并且数组本身与元素类型的对齐要求对齐.

  2. 结构没有这样的限制; 它们可以受到任意填充.但是,给定的实现(在给定版本中)将在所有翻译单元中以相同的方式执行此操作(否则,如何使用相同的结构定义来跨翻译单元传递数据?).通常的方法是相当理智,特别是当struct 包含单个类型的成员时.对于这样的结构,对齐通常匹配成员的最大对齐,并且通常没有填充,因为所有成员具有相同的对齐.

在你的情况下,1024个浮点数的数组和1024个浮点数的结构几乎肯定具有完全相同的内存布局.标准绝对不能保证这一点,但您的编译器可能会记录其结构布局规则,并且您可以始终在单元测试中断言大小和对齐匹配(您确实有单元测试,对吧?)

鉴于这些警告,你几乎肯定能够简单地reinterpret_cast(或memcpy)在两者之间.