Интеллектуальные указатели относятся к владению.
Владение - к пожизненному сроку.
const std::string toJson(const Location &obj);
Это говорит «вы передадите obj
, который является действительным Location
, и эта функцияобещает не менять его ".
Возвращаемое значение - const std::string
- является токсичным анти-паттерном.Не делай этого.Возврат std::string
.
std::string toJson(std::weak_ptr<const Location> obj);
Это заявляет: «Я возьму, возможно, допустимую ссылку на obj
, который я буду точно хранить где-то. В какой-то неизвестный момент в будущем я проверю, по-прежнему ли этот объектсуществует и создайте общий указатель на него.После вызова этой функции не предполагайте, что время жизни указанного в obj
закончится в любом контролируемом месте, но обычно я буду вежлив и не буду удерживать сгенерированныйshared_ptr
для более короткого бита ".
std::string toJson(std::shared_ptr<const Location> obj);
Это говорит:" Я хочу участвовать в совместном управлении указанным obj
. obj
имеет и должен иметь сложный срок службы, которыйне может быть легко выражено через простое владение. Я попытался использовать более простые модели владения, но они не отражают истинную сущность того, как долго obj
должен выжить, поэтому я использую указатели с подсчетом ссылок. "
std::unique_ptr<Location> uniqueLocation = getLocation();
Это говорит: «Я хочу контролировать владение этим объектом, который никогда не был в сложной ситуации владения. Если бы я мог, я был бы ценностью (или, может быть,необязательно), но некоторые проблемы не позволяют мне быть ценным.Так что я буду уникальным указателем на значение. "
Сериализации не нужно вступать во владение unique_ptr. Какой метод он должен вызывать??
Функция, которая конвертирует вещи в Json, вероятно, просто нуждается в конвертируемом объекте, чтобы быть действительной для длины вызова.
toJson(const Location&)
- это та, которая означает это.