是否可以测试两个迭代器是否指向同一个对象?

Meh*_*dad 5 c++ iterator stl

假设我正在制作一个函数来复制一个值:

template<class ItInput, class ItOutput>
void copy(ItInput i, ItOutput o) { *o = *i; }
Run Code Online (Sandbox Code Playgroud)

如果和指向同一个对象,我想避免赋值,因为这样赋值就毫无意义了。io

显然,我不能说if (i != o) { ... },因为io可能是不同的类型,也因为它们可能指向不同的容器(因此是不可比较的)。不太明显的是,我也不能使用重载的函数模板,因为即使它们具有相同的类型,迭代器也可能属于不同的容器。

我对此的最初解决方案是:

template<class ItInput, class ItOutput>
void copy(ItInput i, ItOutput o)
{
    if (&*o != static_cast<void const *>(&*i))
        *o = *i;
}
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否有效。如果*o*i实际上返回一个对象而不是一个引用怎么办?

一般有没有办法做到这一点?

chr*_*ffe 3

我认为在这种情况下,您可能必须记录一些关于您在函数中期望的类型的假设,并且满足于不完全通用。

就像operator*operator&可以超载来做各种各样的事情。如果你要防范operator*,那么你应该考虑operator&operator!=,等等。

我想说,执行的一个很好的先决条件(通过代码中的注释或概念/静态断言)是返回对operator*迭代器指向的对象的引用,并且它不(或不应该)执行复制。在这种情况下,您的代码看起来不错。

  • @Mehrdad 定义这些是因为它们使得使用具有较少琐碎函数的迭代器变得更加容易。有时您需要使用迭代器指向的实际类型,然后您需要使用这些 typedef。 (2认同)
  • “我想说,一个很好的假设是 `operator*` 返回对迭代器所指向的对象的引用”——但事实并非如此,因为输入迭代器允许取消引用任何“可转换为 `T`”的东西(§ 24.2.3/2)。 (2认同)