#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;
}