Блог пользователя angelbeats

Автор angelbeats, история, 3 года назад, По-английски
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

Полный текст и комментарии »

  • Проголосовать: нравится
  • -28
  • Проголосовать: не нравится

Автор angelbeats, 3 года назад, По-английски
portable version
#include <tuple>
using namespace std;
#define numargs(args...) tuple_size<decltype(make_tuple(args))>::value
#define argi(i, args...) get<i>(make_tuple(args))
#define rep(i, args...) for (int i = ((numargs(args) > 1) ? argi(0, args) : 0); i < argi(numargs(args) - 1, args); ++i)
#define repi(args...) rep(i, args)

First, let argv := make_tuple(args), to get argc out of args, we use argc := tuple_size<decltype(argv)>::value, according to link. Second, we use (argc - 1 > 0) ? get<1>(argv) : 0 as the base, and get<(argc - 1)>(argv) as the end.

The code below is tested among G++11, G++14, G++17, Clang++17. For all users including MSVC, use ... instead of args... and __VA_ARGS__ instead of args.

#include <tuple>
#include <cassert>
using namespace std;
#define numargs(args...) tuple_size<decltype(make_tuple(args))>::value
#define argi(i, args...) get<i>(make_tuple(args))
#define rep(i, args...) for (int i = ((numargs(args) > 1) ? argi(0, args) : 0); i < argi(numargs(args) - 1, args); ++i)
#define repi(args...) rep(i, args)

int main() {
    int s = 0;
    repi(5) s += i;
    rep(i, -4, 5) s += i;
    assert(s == 10);
    return 0;
}

By the way, I'm using #define pb(args...) push_back(args) instead of #define pb push_back

Полный текст и комментарии »

  • Проголосовать: нравится
  • +10
  • Проголосовать: не нравится