#include <iostream>
template<typename T>
struct CustomMessage
{
const T& t;
CustomMessage(const T& t) : t(t)
{}
};
struct DefaultMessage
{
template<typename T> CustomMessage<T> operator() (const T& t)
{
return {t};
}
};
template<typename T>
std::ostream& operator<< (std::ostream& os, const CustomMessage<T>& message)
{
return os << message.t;
}
std::ostream& operator<< (std::ostream& os, const DefaultMessage& message)
{
return os << "no paren\n";
}
using namespace std;
#define FOO std::cout << DefaultMessage{}
int main() {
int x = 42;
FOO;
FOO(x);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IEN1c3RvbU1lc3NhZ2UKewoJY29uc3QgVCYgdDsKCUN1c3RvbU1lc3NhZ2UoY29uc3QgVCYgdCkgOiB0KHQpCgl7fQp9OwoKc3RydWN0IERlZmF1bHRNZXNzYWdlCnsKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IEN1c3RvbU1lc3NhZ2U8VD4gb3BlcmF0b3IoKSAoY29uc3QgVCYgdCkKCXsKCQlyZXR1cm4ge3R9OwoJfQp9Owp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEN1c3RvbU1lc3NhZ2U8VD4mIG1lc3NhZ2UpCnsKCXJldHVybiBvcyA8PCBtZXNzYWdlLnQ7Cn0KCnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgRGVmYXVsdE1lc3NhZ2UmIG1lc3NhZ2UpCnsKCXJldHVybiBvcyA8PCAibm8gcGFyZW5cbiI7Cn0KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIEZPTyBzdGQ6OmNvdXQgPDwgRGVmYXVsdE1lc3NhZ2V7fQoKaW50IG1haW4oKSB7CglpbnQgeCA9IDQyOwoJRk9POwoJRk9PKHgpOwoJcmV0dXJuIDA7Cn0=