#include <cstddef>
#include <iostream>

template <typename T> struct Printable
{
    Printable(const T& val) : val(val) {}
    void print(std::ostream& out) const {out << val;}
    const T& val;
};

template <> struct Printable<std::nullptr_t>
{
    Printable(nullptr_t) {}
    void print(std::ostream& out) const {out << "null";}
};

template <typename T>
Printable<T> printable(const T& value) {return Printable<T>(value);}

template <typename T>
std::ostream& operator<<(std::ostream& out, const Printable<T>& p)
{
    p.print(out);
    return out;
}

int main()
{
	std::cout << printable(42) << " " << printable(nullptr) << "\n";
	return 0;
}