C++ 11使這更舒適!
我使用類型別名很多來對付這個問題。這其中,尤其使我的代碼了很多更具可讀性:
template <class T>
using PtrList<T> = std::vector<std::shared_ptr<T>>;
這是唯一真正需要的接口的,所以你應該在實現使用auto
和std::make_shared
獨佔。
當使用或迭代指針容器時,使用Boost.Range也非常方便 - 特別是boost::adaptors::indirected
。
下面是一個使用了大量的智能指針,但避免了長期類型的一個小例子:從C++ 11
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;
}
使用'auto'。而且大多數IDE應該爲你做自動補全,這麼長的名字應該沒有太大的區別 –