Я пытаюсь понять, чего можно достичь с помощью интеллектуальных указателей.
Но есть что-то вроде препятствия.
Обычный указатель имеет краткое определение Someclass *p
но интеллектуальные указатели несколько длиннее shared_ptr<SomeClass> p
и я чувствую, что становится утомительно, когда приходится иметь дело с шаблонами (например, вектором) этих указателей.
Так что там короткая запись для интеллектуального указателя? Или есть стандартный способ разрешить использование сокращений?
Я знаю о typedef, но мне все равно кажется, что у меня везде будет много typedef.
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;
}