自带延迟的tg版微博
#CPP
// MAP(f, a, b, c...)
// -> f(a) , f(b) , f(c) ...
#define MAP(macro, ...) __VA_OPT__(EXPAND(MAP_IMPL(macro, __VA_ARGS__)))
#define MAP_IMPL_AGAIN() MAP_IMPL
#define MAP_IMPL(macro, first, ...) \
macro(first) __VA_OPT__(, MAP_IMPL_AGAIN PARENS (macro, __VA_ARGS__))
// MAP_WITHOUT_COMMA(f, a, b, c...)
// -> f(a) f(b) f(c) ...
#define MAP_WITHOUT_COMMA(macro, ...) __VA_OPT__(EXPAND(MAP_WITHOUT_COMMA_IMPL(macro, __VA_ARGS__)))
#define MAP_WITHOUT_COMMA_IMPL_AGAIN() MAP_WITHOUT_COMMA_IMPL
#define MAP_WITHOUT_COMMA_IMPL(macro, first, ...) \
macro(first) __VA_OPT__(MAP_WITHOUT_COMMA_IMPL_AGAIN PARENS (macro, __VA_ARGS__))#include <iostream>
using namespace std;
#define PARENS ()
#define EXPAND(...) EXPAND4(EXPAND4(EXPAND4(EXPAND4(__VA_ARGS__))))
#define EXPAND4(...) EXPAND3(EXPAND3(EXPAND3(EXPAND3(__VA_ARGS__))))
#define EXPAND3(...) EXPAND2(EXPAND2(EXPAND2(EXPAND2(__VA_ARGS__))))
#define EXPAND2(...) EXPAND1(EXPAND1(EXPAND1(EXPAND1(__VA_ARGS__))))
#define EXPAND1(...) __VA_ARGS__
#define LOG(tag, ...) log(tag, PREPEND_NAMES(__VA_ARGS__))
#define PREPEND_NAMES(...) __VA_OPT__(EXPAND(PREPEND_NAMES_IMPL(__VA_ARGS__)))
#define PREPEND_NAMES_IMPL(first, ...) \
PREPEND_ITEM_NAME(first) __VA_OPT__(, PREPEND_NAMES_IMPL_AGAIN PARENS (__VA_ARGS__))
#define PREPEND_NAMES_IMPL_AGAIN() PREPEND_NAMES_IMPL
#define PREPEND_ITEM_NAME(item) #item " =", item, "|"
template<typename T, typename... Args>
void log(T tag, Args... args) {
cout << tag << ' ';
(..., (cout << args << ' ')) << endl;
}
int main() {
int a, b, c, d, e;
LOG("[nums]", a, b, c, d, e);
}#CPP
成功了!
宏,好牛逼;宏,好傻逼。