通过变量名遍历struct

dberm22

更新:6个月后,我刚遇到以下答案:索引到结构是否合法?:Slava回答我认为这是比此处提供的任何解决方案都更好的解决方案,因为绝对没有未定义的行为。希望这对下一个人有所帮助,因为现在实施我已经太迟了。


在您发表评论告诉我使用数组或向量或任何形式的容器之前,这是我不能接受的硬道理。我知道,这可以通过数组来解决,否则任何解决方案都是相当“ hacky”的。我很想使用一个容器,但是我绝对不能。

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

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

struct pseudovector
{
    float data1;
    float data2;
    float data3;
    ...
    float data1024;
}

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

以相同的方式,我尝试通过预编译器##关联(https://stackoverflow.com/a/29020943/2066079遍历该结构,但是由于此操作是在预编译时完成的,因此无法用于运行-时间获取/设置。

我已经看过如何实现反射,例如如何向C ++应用程序添加反射?Ponder Library,但是这两种方法都要求您显式地写出可以反映的每个项目。在这种情况下,我不妨std::map<string, float>通过字符串/整数串联在for循环中创建一个and进行迭代:

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

谁能推荐一种更清洁的解决方案,不需要我写出超过1024行的代码?感谢您的帮助!

再次,我重复一遍-我绝对不能使用任何类型的数组/向量。

安德鲁

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

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

  2. 结构没有这样的限制。它们可以任意填充。但是,给定的实现(给定的版本)将在所有翻译单元中以相同的方式执行此操作(否则,将如何使用相同的结构定义在翻译单元之间传递数据?)。通常这样做是相当明智的,尤其是当该结构包含单个类型的成员时。对于这样的结构,对齐方式通常与成员的最大对齐方式匹配,并且由于所有成员都具有相同的对齐方式,因此通常不存在填充。

就您而言,您的1024个float数组和具有1024个float成员的结构几乎可以肯定具有完全相同的内存布局。标准绝对不能保证,但是您的编译器可能会记录其结构布局规则,并且您始终可以在单元测试中声明大小和对齐方式匹配(您确实有单元测试,对吗?)

有了这些注意事项,您几乎肯定可以在两者之间简单地reinterpret_cast(或memcpy)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

遍历动态变量名

来自分类Dev

如何使用freemarker遍历变量名

来自分类Dev

如何通过变量名访问变量

来自分类Dev

javascript removeEventListener通过变量名

来自分类Dev

根据变量名在R中的前缀循环遍历

来自分类Dev

如何在Arduino上遍历变量名?

来自分类Dev

通过变量名进行Spring自动装配

来自分类Dev

通过变量名传递可选参数的Python方法

来自分类Dev

通过for循环在UNIX中动态更改变量名

来自分类Dev

通过变量名进行Spring自动装配

来自分类Dev

遍历shell变量名称

来自分类Dev

匹配变量名

来自分类Dev

Python变量名

来自分类Dev

R 通过部分匹配来自其他变量名的字符串来创建新的变量名

来自分类Dev

HTML中的Python:通过更改变量名称遍历多个列表

来自分类Dev

R:如何使用数字索引来遍历变量名(例如在Stata中)

来自分类Dev

用其他变量名替换变量名

来自分类Dev

Bash-在变量名中扩展变量名

来自分类Dev

动态变量名/增量变量名

来自分类Dev

为什么struct在C / C ++中有两个变量名

来自分类Dev

VBA通过连接字符串和变量来创建变量名?

来自分类Dev

JavaScript:通过变量名查找变量的值,在这里eval可以接受吗?

来自分类Dev

如何通过在函数中传递部分变量名来按名称获取变量

来自分类Dev

动态创建变量名?

来自分类Dev

使变量名不能包含+?

来自分类Dev

获取NullReferenceException的变量名

来自分类Dev

CMD变量名限制?

来自分类Dev

R缺少变量名

来自分类Dev

如何获取变量名