#include <iostream>
#include <string>
struct foo {
foo(const char* file, int line) : FOO_A(*this), FOO_B(*this) {
std::cout << file << ":" << line << '\n';
}
template <typename T>
foo& op(T val, const char* str) {
std::cout << str << "=" << val << " ";
return *this;
}
foo& FOO_A;
foo& FOO_B;
};
#define FOO_A(x) FOO_OP(x, B)
#define FOO_B(x) FOO_OP(x, A)
#define FOO_OP(x, next) \
op((x), #x).FOO_ ## next
#define FOO\
if ( (false) )\
;\
else foo(__FILE__, __LINE__).FOO_A
int main() {
// recursive macros, wooo
std::string world = "world";
FOO("hello")(world)(40 + 2)("blah")(14.5f)('x');
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKc3RydWN0IGZvbyB7CiAgICBmb28oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIDogRk9PX0EoKnRoaXMpLCBGT09fQigqdGhpcykgewogICAgICAgIHN0ZDo6Y291dCA8PCBmaWxlIDw8ICI6IiA8PCBsaW5lIDw8ICdcbic7CiAgICB9CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICBmb28mIG9wKFQgdmFsLCBjb25zdCBjaGFyKiBzdHIpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgc3RyIDw8ICI9IiA8PCB2YWwgPDwgIiAiOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIGZvbyYgRk9PX0E7CiAgICBmb28mIEZPT19COwogIH07CiAgCiNkZWZpbmUgRk9PX0EoeCkgRk9PX09QKHgsIEIpCiNkZWZpbmUgRk9PX0IoeCkgRk9PX09QKHgsIEEpCiNkZWZpbmUgRk9PX09QKHgsIG5leHQpIFwKICAgIG9wKCh4KSwgI3gpLkZPT18gIyMgbmV4dAoKI2RlZmluZSBGT09cCiAgaWYgKCAoZmFsc2UpIClcCiAgICA7XAogIGVsc2UgZm9vKF9fRklMRV9fLCBfX0xJTkVfXykuRk9PX0EgCgppbnQgbWFpbigpIHsKICAgIC8vIHJlY3Vyc2l2ZSBtYWNyb3MsIHdvb28KICAgIHN0ZDo6c3RyaW5nIHdvcmxkID0gIndvcmxkIjsKICAgIEZPTygiaGVsbG8iKSh3b3JsZCkoNDAgKyAyKSgiYmxhaCIpKDE0LjVmKSgneCcpOwp9