(注: 私はこのプロジェクトを学習用に書いています。冗長であるというコメントは...ええと、冗長です。;)
私はランダム アクセス イテレータを実装しようとしていますが、このテーマに関する文献はほとんど見つかりませんでした。そのため、Wikpedia のオペレータ オーバーロード プロトタイプのリストと組み合わせて試行錯誤を繰り返しています。これまでのところ十分に機能していますが、問題が発生しました。
次のようなコード
exscape::string::iterator i = string_instance.begin();
std::cout << *i << std::endl;
機能し、文字列の最初の文字を出力します。ただし、*(i + 1) は機能せず、*(1 + i) も機能しません。私の完全な実装は明らかに少し多すぎますが、その要点は次のとおりです。
namespace exscape {
class string {
friend class iterator;
...
public:
class iterator : public std::iterator<std::random_access_iterator_tag, char> {
...
char &operator*(void) {
return *p; // After some bounds checking
}
char *operator->(void) {
return p;
}
char &operator[](const int offset) {
return *(p + offset); // After some bounds checking
}
iterator &operator+=(const int offset) {
p += offset;
return *this;
}
const iterator operator+(const int offset) {
iterator out (*this);
out += offset;
return out;
}
};
};
}
int main() {
exscape::string s = "ABCDEF";
exscape::string::iterator i = s.begin();
std::cout << *(i + 2) << std::endl;
}
上記は失敗します (632 行目はもちろん *(i + 2) 行です):
string.cpp: 関数 'int main()': string.cpp:632: エラー: '*exscape::string::iterator::operator+(int)(2)' 文字列の 'operator*' に一致しません。 cpp:105: 注: 候補は: char& exscape::string::iterator::operator*()
*(2 + i) は以下で失敗します:
string.cpp: 関数 'int main()' 内: string.cpp:632: エラー: '2 + i' の 'operator+' に一致しません string.cpp:434: 注: 候補は: exscape::string exscape: :operator+(const char*, const exscape::string&)
私の推測では、さらにオーバーロードを行う必要がありますが、どの演算子が欠けているのかわかりません。