はBoost transform_iteratorを使用してオプションです:
#include <list>
#include <boost/iterator/transform_iterator.hpp>
#include <tr1/memory>
#include <tr1/functional>
using std::list;
using std::tr1::shared_ptr;
using boost::transform_iterator;
using boost::make_transform_iterator;
using std::tr1::mem_fn;
using std::tr1::function;
struct Foo {};
struct Bar
{
typedef shared_ptr<Foo> Ptr;
typedef list<Ptr> List;
typedef function< Foo* (Ptr) > Functor;
typedef transform_iterator< Functor, List::iterator > Iterator;
Iterator begin()
{
return make_transform_iterator(fooptrs.begin(), mem_fn(&Ptr::get));
}
Iterator end()
{
return make_transform_iterator(fooptrs.end(), mem_fn(&Ptr::get));
}
List fooptrs;
};
C++ 11は、それが簡単にfunction
ラッパーを排除するためになるだろうが、私はそれをテストするための便利なコンパイラを持っていません。あなたが必要性を見た場合は、(私はAdobeがこの目的のために無料のany_iterator
クラステンプレートを提供していますね。)型の消去を使用してIterator
の具体的な種類をも隠すことができ
'shared_ptr'の通常のポインタ(' * p'と 'p-')は、どちらも正しいことをしています。 – GManNickG
私は間違っているかもしれませんが、未加工のポインタとスマートなポインタの両方を提供することは、問題を求めるように見えます。特に、生ポインタが書き込みを許可する場合。あなたはどんな種類のイテレータを探していますか?もし私があなただったら、私はおそらく、最も単純なもの、例えば、 "ForwardIterator"から始めるでしょう。 – dirkgently
私は 'shared_ptr'が' * p'と 'p->'と同じように動作することを知っています。しばらくの間、私は違いを気にしませんでした。しかし、それはユーザーインターフェイスになると問題です。 APIの他の関数はポインタを引数として取ります。したがって、ユーザがイテレータからオブジェクトを取得した場合、ユーザは未処理のポインタを取得するために 'it-> get()'を使用する必要があります。私は大したことではないと思うが、エンドユーザの観点から見ると、ユーザは基底のオブジェクトが 'shared_ptr'によって保持されていることを知るべきではない。だから、私はそれを図書館全体で一貫させたいと思っています。 –