#include <map>
#include <iostream>
namespace mylib
{
	enum visual
	{
		v_binary,
		v_decimal
	};
}
namespace
{
	::std::map< std::ostream const*, mylib::visual> _association;
}
namespace mylib
{
	template<visual _v>
	struct manip
	{
		const static visual v = _v;
	};
	const manip<v_binary> binary;
	const manip<v_decimal> decimal;
	template<visual _v>
	::std::ostream& operator<< (::std::ostream& os, manip<_v> const& manipulator)
	{
		::_association[&os] = manipulator.v;
		return os;
	}
	class storage
	{
		char _c;
	public:
		storage(char c = 0) : _c(c) {}
		void set(char c) { _c = c; }
		char get() const { return _c; }
	};
	::std::ostream& operator<< (::std::ostream& os, storage const& data)
	{
		if(::_association[&os] == v_binary)
		{
			os << data.get();
		}
		else if(::_association[&os] == v_decimal)
		{
			os << static_cast<int>(data.get());
		}
		else
		{
			// enum-exception
		}
		return os;
	}
}
int main()
{
	mylib::storage inst('h');
	std::cout << mylib::binary << inst << '\n';
	std::cout << mylib::decimal << inst << '\n';
}