3

漠然と次のように見えるコードを想定します。

bool LoadGame() {
  vector<string> SaveFile = LoadFromSaveFile();
  Data = SaveFile.begin();
  LoadCharacters(&Data);
    // containing LoadOneCharacter(&Data) calls
  LoadLocations(&Data);
    // >> LoadOneLocation(&Data) calls
  // etc.
}

LoadGame() によって呼び出されるすべての関数に SaveFile::end() を渡さずに、LoadCharacters()、LoadLocations() などの中で Data が現在 SaveFile::end() を指しているかどうかを確認する方法はありますか?

(end() 以降の逆参照のみが、未定義の動作を生成する代わりに例外をスローした場合!)

4

2 に答える 2

5

一般にはありえない。多くの実装では、多くの種類の反復子は単なるポインターであり、基になるコンテナーを理解していません。

両方の反復子を渡すか、range( boostC++0x IIRC ではなく C++0x IIRC にある) などの別の構造体を渡す必要があります。

于 2012-09-28T00:25:16.560 に答える
5

これは一般的なケースでは不可能です

特定のケースでは、イテレータ実装の実装固有の詳細を利用してコンテナを取得できる場合があります。

標準コンテナ ライブラリのイテレータには、AFAIR で文書化されたそのような詳細はありません。


特殊なケースは、入力の終わりをチェックするために、それ自体のデフォルトで構築されたstd::istream_iterator<>インスタンスと常に比較できるような入力イテレータです。

std::istringstream iss("test");
std::istream_iterator<char> it(iss);

// you can always check for end of input:
while (std::istream_iterator<char>() != it)
{
    it++;
}
于 2012-09-28T00:21:32.080 に答える