假设代码看起来像这样模糊:
bool LoadGame() {
vector<string> SaveFile = LoadFromSaveFile();
Data = SaveFile.begin();
LoadCharacters(&Data);
// containing LoadOneCharacter(&Data) calls
LoadLocations(&Data);
// >> LoadOneLocation(&Data) calls
// etc.
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在LoadCharacters(),LoadLocations()等内部检查Data当前是否指向SaveFile :: end(),而不将SaveFile :: end()传递给LoadGame()调用的所有函数?
(如果只是取消引用end()和更多引发异常而不是生成未定义的行为!)
在一般情况下,这是不可能的
在特定情况下,您可以利用迭代器实现的特定于实现的详细信息来获取容器.
标准容器库的迭代器没有记录 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++;
}
Run Code Online (Sandbox Code Playgroud)
一般来说这是不可能的.在许多实现中,多种迭代器只是指针,并且不了解底层容器.
您需要传递两个迭代器,或者传递一个不同的结构,例如a range(它在boostC++ 0x IIRC中).