generic way to print out variable name in c++

前端 未结 6 774
难免孤独
难免孤独 2020-12-05 20:47

given a class

struct {
  int a1;
  bool a2;
  ...
  char* a500;
  ...
  char a10000;      
}

I want to print or stream out



        
6条回答
  •  隐瞒了意图╮
    2020-12-05 21:50

    You can employ an evil macro:

    #define DUMP(a) \
        do { std::cout << #a " is value " << (a) << std::endl; } while(false)
    

    Usage example (Edit now updated with example for struct members):

    #include 
    
    #define DUMPSTR_WNAME(os, name, a) \
        do { (os) << (name) << " is value " << (a) << std::endl; } while(false)
    
    #define DUMPSTR(os, a) DUMPSTR_WNAME((os), #a, (a))
    #define DUMP(a)        DUMPSTR_WNAME(std::cout, #a, (a))
    
    struct S {
        int a1;
        float a2;
        std::string a3;
    
        std::ostream& dump(std::ostream& os)
        {
            DUMPSTR(os, a1);
            DUMPSTR(os, a2);
            DUMPSTR(os, a3);
            return os;
        }
    };
    
    int main()
    {
        S s = { 3, 3.14, "  03.1415926" };
    
        s.dump(std::cout);
    
        DUMP(s.a1);
        DUMP(s.a2);
        DUMP(s.a3);
    
        return 0;
    }
    

    See live demo on CodePad

    Why the funny macro?

    Answering the unasked question. Consider what happens if you nest the macro invocation in a conditional, or a for loop. Marshall Cline explains the rest

提交回复
热议问题