gpt4 book ai didi

c++ - 在循环中顺序遍历成员变量

转载 作者:行者123 更新时间:2023-11-28 01:27:31 24 4
gpt4 key购买 nike

这是我在循环中顺序遍历类/结构中的成员变量的实现,这是一个典型的例子。我的实现看起来很丑,看起来像是用蛮力实现的。如何改进或推广它。我想像在链接列表的 node->next 或数组中那样推进变量?征求意见。提前感谢大师们。

typedef struct {
string name;
string address;
string phone;

void set(const int idx, string str) {
idx == 0 ? name = str : idx == 1 ? address = str : phone = str;
}
void print() const {
std::cout << name << "-" << address << "-" << phone << '\n';
}
} Person ;

int main()
{
Person p;
string str;
stringstream ss{ "John London 9735048383" };

int idx = 0;
while (std::getline(ss, str, ' ')) {
p.set(idx++,str); // Traversing the member variables. The member variables will take turn to set their values in order.
}
p.print();

}

已编辑:所有成员变量都是同一类型。

最佳答案

除了使用宏,您还可以使用指向成员的指针。请注意,在 C++ 中,您不必 typedef struct

struct Person {
std::string name;
std::string address;
std::string phone;

void print() const {
std::cout << name << "-" << address << "-" << phone << '\n';
}
};

int main()
{
Person p;
std::string str;
std::stringstream ss{ "John London 9735048383" };
std::vector<std::string(Person::*)> members = { &Person::name, &Person::address, &Person::phone };

for (auto it = members.begin(); std::getline(ss, str, ' ') && it != members.end(); ++it) {
std::invoke(*it, p) = str;
// Traversing the member variables. The member variables will take turn to set their values in order.
}
p.print();
}

您可以使 invoke 稍微更容易接受,前提是您不关心停止流错误。

for (auto member : members)
{
std::getline(ss, invoke(member, p), ' ');
}

关于c++ - 在循环中顺序遍历成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53121102/

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