【发布时间】:2016-05-18 22:17:42
【问题描述】:
更新:6 个月后,我刚刚遇到了这个答案:Is it legal to index into a struct?: Answer by Slava。我认为这是比此处提供的任何解决方案更好的解决方案,因为绝对没有未定义的行为。希望这对下一个人有所帮助,因为对我来说已经太迟了。
在您评论告诉我使用数组或向量或任何形式的容器之前,这是一个硬道理,我不能。我知道,这将通过数组来解决,否则任何解决方案都非常“hacky”。我很想使用容器,但我绝对不能。
我是一家大型公司的中级开发人员,我们正在使用公司范围内的库通过以太网发送数据。为什么它不能支持数组/向量有多种原因,而是使用 POD 结构(普通旧数据 - 字符、浮点数、整数、布尔值)。我从一个浮点数组开始,我必须使用它来填充具有相同数量的浮点数的结构。由于这个库的目的是通过以太网发送消息,所以我只需要进行两次迭代——一次在发送上,一次在接收上。在所有其他时间,此数据都存储为数组。我知道 - 我应该序列化数组并按原样发送它们,但我再说一遍 - 我绝对不能。
我有一个float[1024],必须遍历数组并填充以下结构:
struct pseudovector
{
float data1;
float data2;
float data3;
...
float data1024;
}
我已经用BOOST_PP_REPEAT 和BOOST_PP_SEQ_FOR_EACH_I 生成了这个结构,这样我就不必写出所有的1024 个浮点数,而且它提高了可维护性/可扩展性。
以同样的方式,我尝试通过预编译器## concatination (https://stackoverflow.com/a/29020943/2066079) 迭代结构,但由于这是在预编译器时完成的,它不能用于运行时获取/设置。
我已经研究过实现反射,例如 How can I add reflection to a C++ application? 和 Ponder Library,但是这两种方法都要求您明确写出可以反射的每个项目。在这种情况下,我不妨创建一个 std::map<string, float> 并通过字符串/整数连接在 for 循环中进行迭代:
for(i=0;i<1024;i++)
{
array[i] = map.get(std::string("data")+(i+1))
}
谁能推荐一个不需要我写出超过 1024 行代码的更简洁的解决方案?感谢您的帮助!
我再重复一遍 - 我绝对不能使用任何类型的数组/向量。
【问题讨论】:
-
这似乎是反模式。你能把这个结构包装在一个联合中吗?
union wrapper { float arr[1024]; pseudovector vec; }; -
为什么不只是
float[1024] fa; pseudovector pv; memcpy(fa,&pv, sizeof(pv));? -
@c-smile 因为这是未定义的行为
标签: c++ reflection iterator iteration c-preprocessor