【发布时间】:2013-07-03 18:00:24
【问题描述】:
给定两个相同类型的 std::iterators,如何测试它们是否来自同一个对象(不是类)?请注意,我不是在问如何比较它们的值。
std::string foo = "foo";
std::string bar = "bar";
std::string::iterator iter1 = foo.begin();
std::string::iterator iter2 = bar.begin();
if ( iter1 == iter2 )
{
...
}
以上应该并且确实失败了。如何在运行时检查这一点?查看源代码,我看到相关方法调用 iterator::_Compat() 这是一个 void 方法,它执行我想要的检查,但在失败时它会发出调试断言。它在发布版本中不会被注意到。
进一步看,我看到迭代器(至少对于字符串)有一个公共的_GetCont() 方法。所以
if ( iter1._GetCont() == iter2._GetCont() )
有效。但是,这是无证的,导致我相信使用它不安全。
我的问题是如何以便携的方式完成上述任务?
还要注意,这是迭代器模板类的一部分。我将无法控制第二个迭代器。
【问题讨论】:
-
如您所料,
_Compat和_GetCont函数完全依赖于实现,在其他实现中可能不存在(或命名不同)。在我的脑海中,我没有看到一种独立于平台的方式来检查这个(因为迭代器甚至根本不需要对容器的引用,而且在发布中很可能不会,即这个@ 987654327@ 甚至不应该在发布模式下工作)。不过,这是个好问题。