更新:6个月后,我刚刚发现了这个答案:索引结构是否合法?:Slava 的回答 https://stackoverflow.com/a/40590471/2066079。我认为这是一个比这里提供的任何解决方案都要好得多的解决方案,因为绝对没有未定义的行为。希望这对下一个人有帮助,因为对我来说实施已经太晚了。
在您评论告诉我使用数组或向量或任何形式的容器之前,我不能,这是一个残酷的事实。我知道,这可以通过数组来解决,否则任何解决方案都是相当“hacky”的。我很想使用容器,但我绝对不能。
我是一家非常大的公司的中级开发人员,我们正在使用公司范围的库通过以太网发送数据。有多种原因导致它不支持数组/向量,而是使用 POD(普通旧数据 - 字符、浮点数、整数、布尔值)结构。我从一个浮点数数组开始,必须使用它来填充具有相同数量浮点数的结构。由于该库的目的是通过以太网发送消息,因此我只需要进行两次迭代 - 一次在发送,一次在接收。在所有其他情况下,该数据都存储为数组。我知道 - 我应该序列化数组并按原样发送它们,但我再说一遍 - 我绝对不能。
我有一个float[1024]
,并且必须迭代数组并填充以下结构:
struct pseudovector
{
float data1;
float data2;
float data3;
...
float data1024;
}
我已经生成了这个结构BOOST_PP_REPEAT https://stackoverflow.com/questions/18441431/boost-pp-repeat-with-array and BOOST_PP_SEQ_FOR_EACH_I https://stackoverflow.com/questions/18483572/how-can-i-use-a-macro-for-collecting-variable-names/18483867#18483867这样我就不必写出所有 1024 个浮点数,并且它提高了可维护性/可扩展性。
以同样的方式,我尝试通过预编译器迭代结构##
连接(https://stackoverflow.com/a/29020943/2066079 https://stackoverflow.com/a/29020943/2066079),但由于这是在预编译时完成的,因此它不能用于运行时获取/设置。
我已经考虑过实施反射,例如如何向 C++ 应用程序添加反射? https://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-a-c-application and 思考图书馆 https://github.com/billyquith/ponder,但这两种方法都要求您明确写出可以反映的每个项目。在这种情况下,我不妨创建一个std::map<string, float>
并通过字符串/整数连接在 for 循环中迭代:
for(i=0;i<1024;i++)
{
array[i] = map.get(std::string("data")+(i+1))
}
谁能推荐一个更干净的解决方案,不需要我编写超过 1024 行代码?感谢您的帮助!
再次,我重复一遍 - 我绝对不能使用任何类型的数组/向量。