假设我正在制作一个函数来复制一个值:
template<class ItInput, class ItOutput>
void copy(ItInput i, ItOutput o) { *o = *i; }
Run Code Online (Sandbox Code Playgroud)
如果和指向同一个对象,我想避免赋值,因为这样赋值就毫无意义了。io
显然,我不能说if (i != o) { ... },因为i和o可能是不同的类型,也因为它们可能指向不同的容器(因此是不可比较的)。不太明显的是,我也不能使用重载的函数模板,因为即使它们具有相同的类型,迭代器也可能属于不同的容器。
我对此的最初解决方案是:
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实际上返回一个对象而不是一个引用怎么办?
一般有没有办法做到这一点?
我认为在这种情况下,您可能必须记录一些关于您在函数中期望的类型的假设,并且满足于不完全通用。
就像operator*,operator&可以超载来做各种各样的事情。如果你要防范operator*,那么你应该考虑operator&和operator!=,等等。
我想说,执行的一个很好的先决条件(通过代码中的注释或概念/静态断言)是返回对operator*迭代器指向的对象的引用,并且它不(或不应该)执行复制。在这种情况下,您的代码看起来不错。
| 归档时间: |
|
| 查看次数: |
2529 次 |
| 最近记录: |