C++ 为输出对象成员提供隐式变量名

C++ 为输出对象成员提供隐式变量名,c++,struct,implicit-conversion,C++,Struct,Implicit Conversion,下面是控制台输出的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

下面是控制台输出的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
    }
}
void打印(列表*L,int-s){
对于(int i=0;iCUT< P> 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);
}
在C++14中,我们甚至可以不使用
print_成员
函子,而是使用一个通用lambda来获取
auto
参数:

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";
        });
    }
}
void打印(列表*L,int-s)
{
对于(int i=0;i我想
Boost.Variant
可以帮你做到这一点。
member\u n
应该是
std::vector
(或者
std::array
,如果大小不变)。@0x499602D2 size不是const.L[n]一个结构对象,它是一个.CSV文件的缓冲区。你真的用“无名的名字<代码>成员> 1/代码>?”纳瓦兹命名,谢谢,看起来很酷。但是,我在寻找一个标准的解决方案/原始C++代码。这是为了教育目的和寻找逻辑。好,现在就足够了;这看起来很棒。这真是太棒了!您正在将L[x]投给auto作为参考。感谢史诗般的aha。
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());
    }
}
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";
        });
    }
}