given a class
struct {
int a1;
bool a2;
...
char* a500;
...
char a10000;
}
I want to print or stream out
"a1 value is SOME_VALUE"
"a2 value is SOME_VALUE"
"a500 value is SOME_VALUE"
...
"a10000 value is SOME_VALUE"
the type of the member variables are not the same (mainly, int, bool, char*, etc, i.e., no need to overload << operator), and the member variable name could be named with anything, i.e., no rule to follow. Instead of typing explicitely one by one (very big tedious, and error-prone work), is there any generic way?
Thanks for any comments!
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 <iostream>
#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
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With