2012-04-27 9 views
9

私は、参照ではなく、実際の値の型に逆参照できるイテレータを作成しようとしています。 これはboost::iterator_facadeを使用して可能ですか、それともadress \ referenceによって返される値が必要ですか? 反復子ファサードとdereference()関数をブーストする

はもっとspecficであるために、私のイテレータは( std::map::iteratorのように)私のイテレータ value_typeが逆参照上の任意の場所に保存されますが、その場で作成されていないことを意味する、参照の std::pairを返します。

答えて

14

はい、お望みのものが可能です。 (例では、バージョン1.49.0のブーストLIB用ですが、それはまた、新しいディストリビューションのためokです)boost/iterator_facade.hppをご覧ください:

template < 
    class Derived 
    , class Value 
    , class CategoryOrTraversal 
    , class Reference = Value& 
    , class Difference = std::ptrdiff_t 
> 
class iterator_facade 

テンプレート引数Referenceが重要です。 boost::iterator_facadeから派生する場合は、Referenceと指定してください。例えば、あなたのコードは、次のように見えることができます。

template<typename value_type> 
class custom_iterator 
    : public boost::iterator_facade< 
      custom_iterator<value_type>, 
      value_type, 
      boost::forward_traversal_tag, 
      value_type 
     > 
{ 
    ... 
    value_type dereference() const{ return value_type(...); } 
    ... 
}; 
+0

は本当に私を助けて、この答えをいただき、ありがとうございます。私は、リファレンステンプレートの引数を指定する前に、値を返そうとしましたが、質問があります。これはコンパイルされましたが、私のクラスのポインタが奇妙な時にnullになるなど、私には非常に奇妙な結果がもたらされました。私は私の質問は、なぜそれはまったくコンパイルされたのでしょうか? – FlamFace