所以根据这个question,最好将许多运算符作为外部函数而不是成员函数来实现。到目前为止,我认为这是因为“它使代码更加符号化”......虽然我还没有弄清楚为什么除了它看起来不错之外它可能是有利的。我猜测在使用模板时,这意味着你可以在不写大量代码的情况下逃脱?
无论如何,我想知道的是:将operator<
这样的东西作为成员函数实现是否合适?或者这没有优势吗?
我问的原因是因为我永远不会想到将这样的运算符作为外部函数来实现。在我之前看到的许多示例中,运算符始终作为成员函数实现。在外部实施这一最近的想法,现在被认为是“更好”吗?
(PS:有人会澄清为什么外部实施是可行的吗?)
编辑:其实我发现了这个link - 人们似乎不同意最好的方法是什么以及为什么。
答案 0 :(得分:3)
运算符通常被认为是自由函数的原因是它们变为类型对称的。当类型具有隐式转换时,这更重要,或者实际上更重要。
考虑一个optional
类型,类似于即将推出的C ++ 14标准中的std::optional
,可以从模板参数类型隐式转换,并考虑将可选对象与嵌套类型进行比较(和想象一下,您不希望实现标准实际执行的所有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&lt;作为会员功能?或者这没有优势吗?
有些情况下无关紧要,但也无法提供优势。虽然这个陈述并不完全正确......但是对于以某种方式实现的运算符而言查找是不同的,但在一般情况下它并不重要。如果您处于重要的情况,那么需要关注更深层次的问题。