#include #include class CAnyValue { struct CBaseValue; typedef std::auto_ptr CBasePtr; public: CAnyValue() { } CAnyValue(const CAnyValue& other) : m_ptr(other.m_ptr->Clone()) {} CAnyValue& operator=(const CAnyValue& other) { m_ptr = other.m_ptr->Clone(); } template void Set(const TYPE& value) { m_ptr = CBasePtr(new CRealValue(value)); } template TYPE Get(TYPE defaultValue) { CRealValue* actual = dynamic_cast*>(m_ptr.get()); if (actual) { return actual->value; } return defaultValue; } private: struct CBaseValue { virtual ~CBaseValue() {} virtual CBasePtr Clone() = 0; }; template struct CRealValue : public CBaseValue { CRealValue(const TYPE& val) : value(val) {} virtual CBasePtr Clone() { return CBasePtr(new CRealValue(value)); } TYPE value; }; std::auto_ptr m_ptr; }; int main() { CAnyValue val; val.Set(1); printf("Value: %i\n", val.Get(0)); val.Set(1.23f); printf("Value: %f\n", val.Get(0.0f)); CAnyValue val2(val); printf("Value2: %f\n", val2.Get(0.0f)); val.Set(1); printf("Value: %i\n", val.Get(0)); val2 = val; printf("Value2: %i\n", val2.Get(0)); printf("Value2: %f\n", val2.Get(0.0f)); };