#include <iostream>
#include <utility>
using namespace std;
template <class T>
void PrintArgs(const T &a1){
cout << a1 << endl;
}
template <class T, class ...ARGS>
void PrintArgs(const T &a1,const ARGS& ...args){
cout << a1 << ",";
PrintArgs(args...);
}
template <class F,class ...ARGS>
auto LogFunc(const char *fname,F func,ARGS &&... args)
->decltype(func(std::forward<ARGS>(args)...)){
cout << fname << ":";
PrintArgs(args...);
return func(std::forward<ARGS>(args)...);
}
#define LOG_CALL(func,...) LogFunc(#func,func,__VA_ARGS__)
void foo(int a,double b, char c){
}
int main() {
LOG_CALL(foo,1,2.0,'c');
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkIFByaW50QXJncyhjb25zdCBUICZhMSl7Cgljb3V0IDw8IGExIDw8IGVuZGw7Cn0KCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyAuLi5BUkdTPgp2b2lkIFByaW50QXJncyhjb25zdCBUICZhMSxjb25zdCBBUkdTJiAuLi5hcmdzKXsKCWNvdXQgPDwgYTEgPDwgIiwiOwoJUHJpbnRBcmdzKGFyZ3MuLi4pOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgRixjbGFzcyAuLi5BUkdTPgphdXRvIExvZ0Z1bmMoY29uc3QgY2hhciAqZm5hbWUsRiBmdW5jLEFSR1MgJiYuLi4gYXJncykKCS0+ZGVjbHR5cGUoZnVuYyhzdGQ6OmZvcndhcmQ8QVJHUz4oYXJncykuLi4pKXsKCWNvdXQgPDwgZm5hbWUgPDwgIjoiOwoJUHJpbnRBcmdzKGFyZ3MuLi4pOwoJcmV0dXJuIGZ1bmMoc3RkOjpmb3J3YXJkPEFSR1M+KGFyZ3MpLi4uKTsKfQoKI2RlZmluZSBMT0dfQ0FMTChmdW5jLC4uLikgTG9nRnVuYygjZnVuYyxmdW5jLF9fVkFfQVJHU19fKQoKdm9pZCBmb28oaW50IGEsZG91YmxlIGIsIGNoYXIgYyl7CgkKfQoKaW50IG1haW4oKSB7CgkKCUxPR19DQUxMKGZvbywxLDIuMCwnYycpOwoJCgkKCXJldHVybiAwOwp9