gpt4 book ai didi

c++ - 为输出的对象成员提供隐式变量名称

转载 作者:行者123 更新时间:2023-11-30 02:44:06 25 4
gpt4 key购买 nike

下面是控制台输出的 Struct 类型对象的典型实现。

void print(List *L, int s) {
for (int i = 0; i < s; i++){
cout << L[i].member_1 << "\t\t" // int
<< L[i].member_2 << "\t\t" // string
<< L[i].member_3 << "\t\t" // string
<< L[i].member_4 << "\t\t" // string
<< L[i].member_5 << "\t\t" // double
<< L[i].member_6 << "\t\t" // double
<< L[i].member_7 << "\t\t" // int
<< L[i].member_8 << "\t\t"; // char
}
}

上面的内容似乎比它应该的要长。因此,我尝试编写以下代码。

int n = sizeof(L)/sizeof(L[0]);

void print(List *L, int s) {
for (int i = 0; i < s; i++) {
for(int j = 0; j < n; j++) {
cout << L[i].member_ << j << "\t\t";
}
}
}

正如您可能猜到的那样,我是在 JavaScript/后编译方面长大的,所以写这样的东西似乎很自然。我知道我正在为编译器编码,那么如何实现上面的代码呢?不仅仅是更正我的代码,我还希望对后勤方法进行反馈或批评,因为我现在的 OOP 非常多余。我正在寻找标准解决方案/原始 C++ 代码。这是出于教育目的和寻找逻辑。

最佳答案

C++中没有内置的反射机制。静态反射可能是该语言即将推出的版本的主题,但目前还没有通用的方法以某种方式枚举一个类的所有成员。所以你必须在某处明确列出所有成员。但这可以在一个地方重复使用,这里是一个例子:

template <typename F>
void for_each_member(List& l, F f)
{
f(l.member_1);
f(l.member_2);
f(l.member_3);
f(l.member_4);
f(l.member_5);
f(l.member_6);
f(l.member_7);
f(l.member_8);
}

此模板函数为给定 List 的每个成员调用一个仿函数。使用此工具,您的 print 函数可能如下所示:

struct print_member
{
template <typename T>
void operator()(const T& m)
{
cout << m << "\t\t";
}
};

void print(List *L, int s)
{
for (int i = 0; i < s; i++)
{
for_each_member(L[i], print_member());
}
}

使用 C++14,我们甚至可以不使用 print_member 仿函数,而是使用带有 auto 参数的通用 lambda:

void print(List *L, int s)
{
for (int i = 0; i < s; i++)
{
for_each_member(L[i], [](const auto& m)
{
cout << m << "\t\t";
});
}
}

关于c++ - 为输出的对象成员提供隐式变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25592971/

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