3

假设看起来模糊的代码是这样的:

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

有没有办法在 LoadCharacters()、LoadLocations() 等中检查 Data 当前是否指向 SaveFile::end(),而不将 SaveFile::end() 传递给 LoadGame() 调用的所有函数?

(如果仅取消引用 end() 和超越抛出异常而不是产生未定义的行为!)

4

2 回答 2

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 回答
5

一般是不可能的。在许多实现中,许多类型的迭代器只是指针,并不了解底层容器。

您需要传递两个迭代器,或传递不同的结构,例如 a range( 在boost但不是 C++0x IIRC 中)。

于 2012-09-28T00:25:16.560 回答