C++ (Qt)void AddData2Undo( Object * obj, // объект int dataID, // id сохраняемых данных int dataSize, // размер const void * data ) // указатель на данные{ Stream & stream = GetUndoStream(); stream.Write(obj->GetUniqueID()); stream.Write(dataID); stream.Write(dataSize); stream.WriteBlock((char *) data, dataSize);}
C++ (Qt)AddData2Undo(theObject, UNDOPART_COLOR, sizeof(theObject->mColor), &theObject->mColor);
C++ (Qt)template<class T>void AddData2Undo( Object * obj, int dataID, const T & data ){ AddData2Undo_Base(obj, dataID, sizeof(T), &data);}
std::vector<int> vec;...AddData2Undo(obj, UNDOPART_INDICES, vec.size() * sizeof(int), &vec[0]);
C++ (Qt)struct SomeData { int m_id; float m_width; ... QString m_name; // этого члена раньше не было, но вот понадобилось добавить};
C++ (Qt)template<class T>void AddData2Undo( const Object & obj, int dataID, const T & data ){ static_assert(!std::is_pointer_v<T>); AddData2Undo(std::addressof(obj), dataID, sizeof(data), std::addressof(data));}
C++ (Qt)template<class T>void AddData2Undo( const Object & obj, int dataID, const T & data ){ static_assert(std::is_pod<T>::value);
C++ (Qt)template <class T>struct is_block_streamable : public std::false_type {};// Helper variable template.template <class T>inline constexpr bool is_block_streamable_v = is_block_streamable<T>::value; template <>struct is_block_streamable<QRect> : public std::true_type {};template <>struct is_block_streamable<QVector3D> : public std::true_type {};
C++ (Qt)struct A {.. int * b;...};