Today, I was seeing [user:tourist,2020-04-15]'s submissions. He uses a very cool way to print the variables for the purpose of debugging. The function `debug_out` lists all variable names, followed by their values. I found it very interesting and convenient. ↵
↵
However, when you would like to print a long list of variables, it might be hard to match variables and their corresponding values. I made a few changes, and I would like to share the code with you. Please note that you need to define `XOX` (`-D XOX` should do the job). Therefore, when you are submitting your code, you **do not** need to remove or comment out lines including `debug`. Hope you'll find it useful. ↵
↵
↵
~~~~~↵
#include <bits/stdc++.h>↵
using namespace std;↵
vector<string> vec_splitter(string s) {↵
for(char& c: s) c = c == ','? ' ': c;↵
stringstream ss; ss << s;↵
vector<string> res;↵
for(string z; ss >> z; res.push_back(zs += ',';↵
vector<string> res;↵
while(!s.empty()) {↵
res.push_back(s.substr(0, s.find(',')));↵
s = s.substr(s.find(',') + 1);↵
}↵
return res;↵
}↵
void debug_out(↵
vector<string>args, int idx__attribute__ ((unused)) args,↵
__attribute__ ((unused)) int idx, ↵
__attribute__ ((unused)) int LINE_NUM) { cerr << endl; } ↵
template <typename Head, typename... Tail>↵
void debug_out(vector<string> args, int idx, int LINE_NUM, Head H, Tail... T) {↵
if(idx > 0) cerr << ", "; else cerr << "Line(" << LINE_NUM << ") ";↵
stringstream ss; ss << H;↵
cerr << args[idx] << " = " << ss.str();↵
debug_out(args, idx + 1, LINE_NUM, T...);↵
}↵
#ifdef XOX↵
#define debug(...) debug_out(vec_splitter(#__VA_ARGS__), 0, __LINE__, __VA_ARGS__)↵
#else↵
#define debug(...) 42↵
#endif↵
int main() {↵
int x = -1, y = 10000;↵
double z = 0.2;↵
string s = "beginner1010";↵
long long b = 1LL << 60;↵
↵
debug(x, y, z, s, b);↵
↵
double aux = 1010.0;↵
string code = "code";↵
↵
debug(code + "forces",-aux / 10 * 2.3);↵
return 0;↵
}↵
~~~~~↵
↵
Results:↵
↵
~~~~~↵
Line(34) x = -1, y = 10000, z = 0.2, s = beginner1010, b = 1152921504606846976↵
~~~~~↵
↵
↵
↵
Line(39) code + "forces" = codeforces, -aux / 10 * 2.3 = -232.3↵
~~~~~↵
↵
↵
↵
**UPD 1:** The code is further improved to handle the case when an operation is applied to variables in `debug`. The line number is added, and [user:spookywooky,2020-04-16]'s suggestion is applied. Please see the examples. Thank you all for your suggestions.↵
↵
↵
However, when you would like to print a long list of variables, it might be hard to match variables and their corresponding values. I made a few changes, and I would like to share the code with you. Please note that you need to define `XOX` (`-D XOX` should do the job). Therefore, when you are submitting your code, you **do not** need to remove or comment out lines including `debug`. Hope you'll find it useful. ↵
↵
↵
~~~~~↵
#include <bits/stdc++.h>↵
using namespace std;↵
vector<string> vec_splitter(string s) {↵
stringstream ss; ss << s;↵
vector<string> res;↵
for(string z; ss >> z; res.push_back(z
vector<string> res;↵
while(!s.empty()) {↵
res.push_back(s.substr(0, s.find(',')));↵
s = s.substr(s.find(',') + 1);↵
}↵
return res;↵
}↵
void debug_out(↵
vector<string>
__attribute__ ((unused)) int idx, ↵
__attribute__ ((unused)) int LINE_NUM) { cerr << endl; } ↵
template <typename Head, typename... Tail>↵
void debug_out(vector<string> args, int idx, int LINE_NUM, Head H, Tail... T) {↵
if(idx > 0) cerr << ", "; else cerr << "Line(" << LINE_NUM << ") ";↵
stringstream ss; ss << H;↵
cerr << args[idx] << " = " << ss.str();↵
debug_out(args, idx + 1, LINE_NUM, T...);↵
}↵
#ifdef XOX↵
#define debug(...) debug_out(vec_splitter(#__VA_ARGS__), 0, __LINE__, __VA_ARGS__)↵
#else↵
#define debug(...) 42↵
#endif↵
int main() {↵
int x = -1, y = 10000;↵
double z = 0.2;↵
string s = "beginner1010";↵
long long b = 1LL << 60;↵
↵
debug(x, y, z, s, b);↵
↵
double aux = 1010.0;↵
string code = "code";↵
↵
debug(code + "forces",-aux / 10 * 2.3);↵
return 0;↵
}↵
~~~~~↵
↵
Results:↵
↵
~~~~~↵
Line(34) x = -1, y = 10000, z = 0.2, s = beginner1010, b = 1152921504606846976↵
↵
↵
↵
~~~~~↵
↵
↵
↵
**UPD 1:** The code is further improved to handle the case when an operation is applied to variables in `debug`. The line number is added, and [user:spookywooky,2020-04-16]'s suggestion is applied. Please see the examples. Thank you all for your suggestions.↵
↵