angelbeats's blog

By angelbeats, history, 3 months ago, In English
namespace std {
void debug_out() { cerr << endl; }
template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
    cerr << " " << to_string(H);
    debug_out(T...);
}
#ifdef LOCAL
#define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: ", debug_out(__VA_ARGS__)
#define tee(...) [](const auto& x){ cerr << "[" << #__VA_ARGS__ << "]: "; debug_out(x); return x; }(__VA_ARGS__)
#else
#define dbg(...) do {} while(0)
#define tee(...) (__VA_ARGS__)
#endif
}

The code above introduces tee, which simply prints one value and returns it.

g++ -DLOCAL -O2 --std=c++17 -o a a.cpp

Don't use c++11. Don't change std to other names. You can get rid of the std wrapper.

And here's the complete version, which handles tuple of any length, as well as complex.

Complete version

namespace std { template <typename A, typename B> string to_string(pair<A, B> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } template<class Tuple, std::size_t... Is> string to_string_helper(const Tuple& t, std::index_sequence<Is...>) { return (((Is == 0? "(" : ", ") + to_string(std::get(t))) + ...) + ")"; } template<class... Args> string to_string(const std::tuple<Args...>& t) { return to_string_helper(t, std::index_sequence_for<Args...>{}); } template string to_string(const complex& c) { return "C" + to_string(make_pair(c.real(), c.imag())); } string to_string(const string& s) { return '"' + s + '"'; } string to_string(const char* s) { return to_string((string) s); } string to_string(bool b) { return (b ? "true" : "false"); }

string to_string(vector v) { bool first = true; string res = "{"; for (int i = 0; i < static_cast(v.size()); i++) { if (!first) { res += ", "; } first = false; res += to_string(v[i]); } res += "}"; return res; }

template string to_string(bitset v) { string res = ""; for (size_t i = 0; i < N; i++) { res += static_cast('0' + v[i]); } return res; }

template string to_string(A v) { bool first = true; string res = "{"; for (const auto &x : v) { if (!first) { res += ", "; } first = false; res += to_string(x); } res += "}"; return res; }

void debug_out() { cerr << endl; } template<typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << to_string(H); debug_out(T...); }

ifdef LOCAL

define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: ", debug_out(__VA_ARGS__)

define tee(...) [](const auto& x){ cerr << "[" << #__VA_ARGS__ << "]: "; debug_out(x); return x; }(__VA_ARGS__)

else

define dbg(...) do {} while(0)

define tee(...) (__VA_ARGS__)

endif

}

Read more »

 
 
 
 
  • Vote: I like it
  • -28
  • Vote: I do not like it

By angelbeats, 3 months ago, In English
portable version

Read more »

 
 
 
 
  • Vote: I like it
  • +10
  • Vote: I do not like it