相关疑难解决方法(0)

这是否违反严格的别名规则?

根据标准- 聚合或联合类型,在其元素或非静态数据成员(包括递归地,子聚合或包含的联合的元素或非静态数据成员)中包括上述类型之一,这是允许的:

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)

c++ strict-aliasing language-lawyer

12
推荐指数
0
解决办法
161
查看次数

C++ 遍历结构体的成员

说我有一个结构:

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 ++风格的方式来访问结构得到的总和topleftbottomright分别?

我可以写一个循环

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。

c++

7
推荐指数
2
解决办法
687
查看次数

通过变量名迭代struct

更新:6个月后,我刚刚遇到了这样的答案:索引结构是否合法?:Slava回答.我认为这是一个比这里提供的更好的解决方案,因为绝对没有未定义的行为.希望这对下一个人有所帮助,因为对我来说已经太晚了.


在您发表评论告诉我使用数组或向量或任何形式的容器之前,这是一个我不能做的事实.我知道,这将通过数组来解决,否则任何解决方案都非常"hacky".我很想用一个容器,但我绝对不能.

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

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

struct pseudovector
{
    float data1;
    float data2;
    float data3;
    ...
    float data1024;
}
Run Code Online (Sandbox Code Playgroud)

我已经使用BOOST_PP_REPEATBOOST_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行代码?非常感谢您的帮助!

我再说一遍 - 我绝对不能使用任何类型的数组/向量.

c++ iteration reflection iterator c-preprocessor

6
推荐指数
1
解决办法
1186
查看次数