#include <iostream>
#include <boost/variant.hpp>
#include <boost/optional.hpp>
#include <type_traits>

// types not related in any way
class A {};
class B {};
class C {};
class D {};

using ABC_variant = boost::variant<A,B,C>;
using D_optional = boost::optional<D>;


template <typename T>
typename std::enable_if<std::is_same<T,ABC_variant>::value, std::ostream&>::type
operator << (std::ostream& os, const T&)
{
	return os << "ABC";
}

int main() {
	//D_optional dopt;
	D d;
	//std::cout << dopt;
	std::cout << d;
}