#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';
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgpuYW1lc3BhY2UgbXlsaWIKewoJZW51bSB2aXN1YWwKCXsKCQl2X2JpbmFyeSwKCQl2X2RlY2ltYWwKCX07Cn0KbmFtZXNwYWNlCnsKCTo6c3RkOjptYXA8IHN0ZDo6b3N0cmVhbSBjb25zdCosIG15bGliOjp2aXN1YWw+IF9hc3NvY2lhdGlvbjsKfQpuYW1lc3BhY2UgbXlsaWIKewoJdGVtcGxhdGU8dmlzdWFsIF92PgoJc3RydWN0IG1hbmlwCgl7CgkJY29uc3Qgc3RhdGljIHZpc3VhbCB2ID0gX3Y7Cgl9OwoJY29uc3QgbWFuaXA8dl9iaW5hcnk+IGJpbmFyeTsKCWNvbnN0IG1hbmlwPHZfZGVjaW1hbD4gZGVjaW1hbDsKCXRlbXBsYXRlPHZpc3VhbCBfdj4KCTo6c3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8ICg6OnN0ZDo6b3N0cmVhbSYgb3MsIG1hbmlwPF92PiBjb25zdCYgbWFuaXB1bGF0b3IpCgl7CgkJOjpfYXNzb2NpYXRpb25bJm9zXSA9IG1hbmlwdWxhdG9yLnY7CgkJcmV0dXJuIG9zOwoJfQoJY2xhc3Mgc3RvcmFnZQoJewoJCWNoYXIgX2M7CglwdWJsaWM6CgkJc3RvcmFnZShjaGFyIGMgPSAwKSA6IF9jKGMpIHt9CgkJdm9pZCBzZXQoY2hhciBjKSB7IF9jID0gYzsgfQoJCWNoYXIgZ2V0KCkgY29uc3QgeyByZXR1cm4gX2M7IH0KCX07Cgk6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoOjpzdGQ6Om9zdHJlYW0mIG9zLCBzdG9yYWdlIGNvbnN0JiBkYXRhKQoJewoJCWlmKDo6X2Fzc29jaWF0aW9uWyZvc10gPT0gdl9iaW5hcnkpCgkJewoJCQlvcyA8PCBkYXRhLmdldCgpOwoJCX0KCQllbHNlIGlmKDo6X2Fzc29jaWF0aW9uWyZvc10gPT0gdl9kZWNpbWFsKQoJCXsKCQkJb3MgPDwgc3RhdGljX2Nhc3Q8aW50PihkYXRhLmdldCgpKTsKCQl9CgkJZWxzZQoJCXsKCQkJLy8gZW51bS1leGNlcHRpb24KCQl9CgkJcmV0dXJuIG9zOwoJfQp9CmludCBtYWluKCkKewoJbXlsaWI6OnN0b3JhZ2UgaW5zdCgnaCcpOwoJc3RkOjpjb3V0IDw8IG15bGliOjpiaW5hcnkgPDwgaW5zdCA8PCAnXG4nOwoJc3RkOjpjb3V0IDw8IG15bGliOjpkZWNpbWFsIDw8IGluc3QgPDwgJ1xuJzsKfQ==