更新:6个月后,我刚刚发现了这个答案:Is it legal to index into a struct?: Answer by Slava。我认为这比这里提供的任何解决方案都要好得多,因为绝对没有未定义的行为。希望这能帮到下一个人,因为对我来说已经太晚实现了。
在您评论之前,告诉我使用数组或向量或任何形式的容器,这是一个残酷的事实,我不能这样做。我知道,这可以通过数组解决,除此之外的任何解决方案都相当"hacky"。我很乐意使用容器,但我绝对不可以。
我是一家非常大公司的中级开发人员,我们正在使用一个公司范围的库来通过以太网发送数据。有各种各样的原因,不能支持数组/向量,而是使用POD(Plain Old Data - chars、floats、ints、bools)结构体。我从一个floats数组开始,必须使用相同数量的floats来填充一个结构体。由于这个库的目的是通过以太网发送消息,所以我只需要迭代两次-一次发送和一次接收。所有其他时间,这些数据都存储为数组。我知道-我应该将数组序列化并按原样发送,但我重申-我绝对不能这样做。
我有一个float[1024]
,必须迭代整个数组并填充以下结构体:
struct pseudovector
{
float data1;
float data2;
float data3;
...
float data1024;
}
我已经使用BOOST_PP_REPEAT和BOOST_PP_SEQ_FOR_EACH_I生成了这个结构体,这样我就不必写出所有1024个浮点数,而且可以提高可维护性/可扩展性。
同样地,我尝试通过预编译器的##
连接方式来迭代结构体(https://stackoverflow.com/a/29020943/2066079),但由于这是在预编译器时完成的,因此无法用于运行时的获取/设置。
我已经研究过实现反射,例如如何向C++应用程序添加反射?和Ponder库,但这两种方法都需要显式地写出每个可以反射的项。在这种情况下,我可能会创建一个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; };
- kmdrekofloat[1024] fa; pseudovector pv; memcpy(fa,&pv, sizeof(pv));
? - c-smile