There are standard library template functions to move and/or copy objects which you would use instead of memcpy and memmove. These functions will deal with non-trivial classes and are specialized to optimize the trivial cases.
In the case of your Insert() method above, I'd start by allocating raw memory to the new size then use std::unitialized_move to copy the current objects into the new memory. Use std::construct_at to initialize the new items being inserted. Then use std::destroy to uninitialize the original objects before freeing the memory.
I've always done it with raw memory, but you could also use a typed array with new/delete and then use std::copy, or std::move, and let the array destroy itself. But you'd suffer performance wise with extra constructor calls. That might not matter to you though.