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