ライブラリのイテレータクラス(たとえば、MyIterator
)を書いています。constイテレータと非constイテレータを作成する
はstd::vector
のiterator
などstd::vector
MyIterator
ながら、行為のconst_iterator
よう const MyIterator
行為をするためにconstのオーバーロードを使用することをお勧めしますか?
ライブラリのユーザー/開発者は混乱するでしょうか?代替のconstと非constイテレータに専門のできる単一のイテレータクラスを実装するためのテンプレートを使用することになり
// std::iterator example
#include <iostream> // std::cout
#include <iterator> // std::iterator, std::input_iterator_tag
class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
mutable int* p;
public:
MyIterator(int* x) :p(x) {}
MyIterator(const MyIterator& mit) : p(mit.p) {}
MyIterator& operator++() {++p;return *this;}
MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;}
bool operator==(const MyIterator& rhs) {return p==rhs.p;}
bool operator!=(const MyIterator& rhs) {return p!=rhs.p;}
const int& operator*() const {return *p;} // <-- const overload
int& operator*() {return *p;}
};
:よう
実装は次のようになります。私は現在それをやっている(私はブーストがそれをやっていると聞いた...)。しかし、範囲を実装するとテンプレートが非常に迅速に複雑になり、範囲の範囲が(ループのネストされた範囲のように)広がります。
地獄は 'mit'ですか?あなたの質問に答えるかもしれません。 – George
@Georgeイテレーターが「ミット」と呼ばれるように私はそれを取る。おそらく 'my_iterator'の短縮形です。 – NathanOliver
私は混乱するだろうが、それは私だけです。 – jrok