Забыл дописать
template <class TYPE>
class constant
{
private:
const TYPE * lpData;
public:
explicit constant(const TYPE & object) : lpData(&object) {}
const TYPE& Object() const { return *lpData;}
};
//
template <class TYPE>
class temporary : private constant<TYPE>
{
public:
explicit temporary(TYPE& object) : constant<TYPE>(object) {}
TYPE& Object() const {return const_cast<TYPE&>(constant<TYPE>::Object());}
};
//
template <class TYPE>
class result : public TYPE
{
public:
result(const result& rhs) : TYPE(temporary<TYPE>(const_cast<result&>(rhs))) {}
explicit result(TYPE& rhs) : TYPE(temporary<TYPE>(rhs)) {}
};
//
template <class TYPE> struct copy_temporaries
{
private:
operator temporary<TYPE>() {return temporary<TYPE>(static_cast<TYPE&>(*this));}
operator constant<TYPE>() const {return constant<TYPE>(static_cast<const TYPE&>(*this));}
operator result<TYPE>() {return result<TYPE>(static_cast<TYPE&>(*this));}
protected:
copy_temporaries() {}
~copy_temporaries() {}
};