Как мы можем иметь дело с общим / слабым ptr, не делая код огромным?

Я пытаюсь понять, чего можно достичь с помощью интеллектуальных указателей.

Но есть что-то вроде препятствия.

Обычный указатель имеет краткое определение Someclass *p но интеллектуальные указатели несколько длиннее shared_ptr<SomeClass> p и я чувствую, что становится утомительно, когда приходится иметь дело с шаблонами (например, вектором) этих указателей.

Так что там короткая запись для интеллектуального указателя? Или есть стандартный способ разрешить использование сокращений?

Я знаю о typedef, но мне все равно кажется, что у меня везде будет много typedef.

0

Решение

C ++ 11 делает это намного удобнее!

Я часто использую псевдонимы типов для борьбы с этой проблемой. Этот, в частности, сделал мой код более читабельным:

template <class T>
using PtrList<T> = std::vector<std::shared_ptr<T>>;

Это действительно нужно только для интерфейсов, так что вы, вероятно, должны использовать auto а также std::make_shared исключительно в реализациях.

При работе с контейнерами указателей или итерации по ним также очень удобно использовать Boost.Range — особенно boost::adaptors::indirected,

Вот небольшой пример, который использует много умных указателей, но избегает длинных типов:

PtrList<Bar> foo_to_bar(PtrList<Foo> const& fooList)
{
PtrList<Bar> resultList;
resultList.reserve(fooList.size());

for (auto&& foo : fooList | boost::adaptors::indirected)
{
auto bar = std::make_shared<Bar>(foo);
bar->enableAwesomeness();
resultList.push_back(bar);
}

return resultList;
}
1

Другие решения


По вопросам рекламы [email protected]