Вы не можете перемещать объекты по указателям (nullptr или иначе).Вы также не можете продлить срок жизни объектов, указав на них указатели - C ++ просто не работает таким образом.
Поскольку вам нужно полиморфное поведение, вы не можете просто скопировать-конструировать или назначить Obj
указатель.Вы, вероятно, захотите что-то вроде clone()
метода для класса Obj
, как обсуждалось в этом вопросе:
Копирование производных сущностей с использованием только указателей базового класса (без исчерпывающего тестирования!) - C ++
Подробнее об этом.Помните, однако: вы не можете продлить время жизни ссылки на rvalue, поэтому вам нужно каким-то образом создать новый объект.Также помните, чтобы избежать утечки памяти.Поэтому, если ваш clone()
выдает Obj*
, вам нужно написать что-то вроде:
class Objpair {
public:
Objpair(Obj&& a, Obj&&b) :
first(a.clone()),
second(b.clone())
{ }
private:
std::unique_ptr<Obj> first;
std::unique_ptr<Obj> second;
};
на std::shared_ptr
вместо unique_ptr
(см. этот ответ о выборе между двумя).
Если вам нужно "полиморфное" поведение, но вы знаете точные типыa и b во время компиляции, и вы не против иметь разные ObjPair
классы, вы также можете попробовать что-то вроде этого:
template <typename T1, typename T2>
class Objpair {
public:
Objpair(T1&& a, T2&&b) : first(a), second(b)
{ }
private:
T1 first;
T2 second;
};
, и в этом случае не используются указатели (!)