All pastes #35685 Raw Edit

Untitled

public text v1 · immutable
#35685 ·published 2006-01-04 02:14 UTC
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));
};