Какая лучшая подпись для clone () в C ++?
Как писал Скотт Майерс, вы можете воспользоваться расслаблением в системе типов C ++, чтобы объявить clone () и вернуть указатель на фактический объявленный тип:
class Base
{
virtual Base* clone() const = 0;
};
class Derived : public Base
{
virtual Derived* clone() const
};
Компилятор обнаруживает, что clone () возвращает указатель на тип объекта, и позволяет Derived переопределить его, чтобы вернуть указатель на производный.
Желательно, чтобы clone () возвращал умный указатель, который подразумевает передачу семантики владения, например:
class Base
{
virtual std::auto_ptr<Base> clone() const = 0;
};
class Derived : public Base
{
virtual std::auto_ptr<Derived> clone() const;
};
К сожалению, ослабление соглашений не относится к шаблонным интеллектуальным указателям, и компилятор не допустит переопределение.
Итак, кажется, у меня есть два варианта:
Пусть clone () вернет «тупой» указатель и задокументирует, что клиенты ответственны за его удаление.Пусть clone () возвращает умный базовый указатель, и пусть клиенты используют dynamic_cast, чтобы сохранить их в производном указателе, если он им нужен.Является ли один из этих подходов предпочтительным? Или у меня есть способ съесть мою семантику передачи права собственности и иметь сильную безопасность типов?