gpt4 book ai didi

C++ 迭代结构体成员

转载 作者:行者123 更新时间:2023-12-03 00:19:44 24 4
gpt4 key购买 nike

假设我有一个结构:

struct Boundary {
int top;
int left;
int bottom;
int right;
}

和一个 vector

std::vector<Boundary> boundaries;

访问结构体以获取 topleftbottom 之和的最 C++ 风格的方法是什么分别对吧

我可以写一个像这样的循环

for (auto boundary: boundaries) {
sum_top+=boundary.top;
sum_bottom+=boundary.bottom;
...
}

这看起来有很多重复。当然我可以这样做:

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)
}
}

但是这样我就会失去所有有意义的结构成员名称。有没有办法让我可以编写类似以下函数的东西:

sum_top=make_sum(boundaries,"top");

反射在 C++ 中似乎不是一个选项。我愿意使用 C++ 版本 14 之前的版本。

最佳答案

std::accumulate(boundaries.begin(), boundaries.end(), 0, 
[](Boundary const & a, Boundary const & b) { return a.top + b.top); });

(IIRC 边界 const & 可以在 C++17 中自动)

这并没有使其对于特定元素具有通用性,事实上,由于缺乏反射,这不容易概括。

不过,有几种方法可以减轻您的痛苦;

您可以使用指向成员的指针,这对您的场景来说很好,但不太符合 c-plusplus-y:

int Sum(vector<Boundary>const & v, int Boundary::*pMember)
{
return std::accumulate( /*...*/,
[&](Boundary const & a, Boundary const & b)
{
return a.*pMember + b.*pMember;
});
}

int topSum = Sum(boundaries, &Boundary::top);

(对于指向成员的指针,请参见此处: Pointer to class data member "::*" )

您还可以使其通用(任何容器、任何成员类型),并且还可以用 lambda 替换指向成员的指针(也允许成员函数)

关于C++ 迭代结构体成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59196012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com