根据标准- 聚合或联合类型,在其元素或非静态数据成员(包括递归地,子聚合或包含的联合的元素或非静态数据成员)中包括上述类型之一,这是允许的:
struct foo {
float x;
};
void bar(foo*);
float values[9];
bar(reinterpret_cast<foo*>(&values));
Run Code Online (Sandbox Code Playgroud)
但是,我不确定以下示例是否也遵循此规则:
struct foo {
float x;
float y;
float z;
};
void bar(foo*);
float values[9];
assert((sizeof(values) / sizeof(float)) % 3 == 0); // sanity check
bar(reinterpret_cast<foo*>(&values));
Run Code Online (Sandbox Code Playgroud) 说我有一个结构:
struct Boundary {
int top;
int left;
int bottom;
int right;
}
Run Code Online (Sandbox Code Playgroud)
和一个向量
std::vector<Boundary> boundaries;
Run Code Online (Sandbox Code Playgroud)
什么是最C ++风格的方式来访问结构得到的总和top,left,bottom和right分别?
我可以写一个循环
for (auto boundary: boundaries) {
sum_top+=boundary.top;
sum_bottom+=boundary.bottom;
...
}
Run Code Online (Sandbox Code Playgroud)
这似乎有很多重复。当然,我可以这样做:
std::vector<std::vector<int>> boundaries;
for (auto boundary: boundaries) {
for(size_t i=0; i<boundary.size();i++) {
sums.at(i)+=boundary.at(i)
}
}
Run Code Online (Sandbox Code Playgroud)
但是后来我会丢失所有有意义的结构成员名称。有没有办法让我可以编写类似以下函数的内容:
sum_top=make_sum(boundaries,"top");
Run Code Online (Sandbox Code Playgroud)
反射似乎不是 C++ 中的一个选项。我愿意使用 C++ 到版本 14。
更新:6个月后,我刚刚遇到了这样的答案:索引结构是否合法?:Slava回答.我认为这是一个比这里提供的更好的解决方案,因为绝对没有未定义的行为.希望这对下一个人有所帮助,因为对我来说已经太晚了.
在您发表评论告诉我使用数组或向量或任何形式的容器之前,这是一个我不能做的事实.我知道,这将通过数组来解决,否则任何解决方案都非常"hacky".我很想用一个容器,但我绝对不能.
我是一家非常大的公司的中级开发人员,我们正在使用公司范围的库来通过以太网发送数据.有多种原因可以解释为什么它不能支持数组/向量,而是使用POD结构(普通旧数据 - 字符,浮点数,整数,粗体).我从一个浮点数开始,我必须使用它来填充具有相同浮点数的结构.由于这个库的目的是通过以太网发送消息,我只需要进行两次迭代 - 一次在发送上,一次在接收上.所有其他时间,此数据存储为数组.我知道 - 我应该将数组序列化并按原样发送,但我再说一遍 - 我绝对不能.
我有一个float[1024],必须遍历数组并填充以下结构:
struct pseudovector
{
float data1;
float data2;
float data3;
...
float data1024;
}
Run Code Online (Sandbox Code Playgroud)
我已经使用BOOST_PP_REPEAT和BOOST_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行代码?非常感谢您的帮助!
我再说一遍 - 我绝对不能使用任何类型的数组/向量.