0

因此,根据这个问题,最好将许多运算符实现为外部函数而不是成员函数。到目前为止,我认为这是因为“它使代码更加对称”......虽然我还没有弄清楚为什么除了看起来不错之外这可能是有利的。我猜在使用模板时,这意味着您无需编写大量代码就可以逃脱?

无论如何,我想知道的是:实现类似operator<成员函数的东西是否合适?或者这样做没有优势?

我问的原因是因为我从来没有想过将这样的运算符实现为外部函数。在我之前看到的许多示例中,运算符总是作为成员函数实现的。在外部实施它们是否是最近被认为“更好”的想法?

(PS:有人请澄清为什么外部实现是要走的路吗?)

编辑:实际上我已经找到了这个链接——人们似乎不同意最好的方法是什么以及为什么。

4

1 回答 1

3

运算符通常被首选为自由函数的原因是它们在类型上是对称的。当类型具有隐式转换时,这一点更重要,或者实际上根本不重要。

例如,考虑一个optional类似于std::optional即将到来的 C++14 标准的类型,它可以从模板参数类型隐式转换,并考虑将可选对象与嵌套类型进行比较(并假设您不想实现所有operator<变体,标准实际上是这样做的):

// optional is like std::optional, implements operator<(optional<T>,optional<T>)
// but we did not care to provide operator<(T,optional<T>) and operator<(optional<T>,T)
optional<int> oi = 1;      // good, we can implicitly convert
if (oi < 10) {             // and we can compare
...
} else if (0 < oi) {       // we also want to compare this way!
...
}

现在如果operator<被实现为一个自由函数,那么上面的代码就可以工作了。如果它被实现为成员函数,则第二个if将失败,因为在调用成员函数之前不能将转换应用于左侧。

将 operator< 之类的东西实现为成员函数是否合适?或者这样做没有优势?

在某些情况下它并不重要,但它也不会提供优势。虽然这个陈述并不完全正确......对于以一种或另一种方式实现的运算符来说,查找是不同的,但在一般情况下它并不重要。如果您处于重要的情况,那么还有更深层次的问题需要关心。

于 2013-08-28T17:31:28.497 回答