2013-08-28 49 views
0

所以根据这个question,最好将许多运算符实现为外部函数而不是成员函数。到目前为止,我认为这是因为“它使代码更加对称”......尽管我还没有弄清楚为什么这可能是有利的,除了它看起来不错。我猜测在使用模板时,这意味着您可以在不写大量代码的情况下离开。比较运算符`operator``作为成员函数或外部函数的实现

无论如何,我想知道的是:是否适合像operator<这样的成员函数实现?还是没有这个好处?

我想问的原因是因为我永远不会想到将这样的操作符实现为外部函数。在我之前见过的很多例子中,操作符总是作为成员函数来实现的。他们在外部实施了一项近期被认为是“更好”的想法吗?

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

编辑:其实我发现这个link - 人们似乎不同意什么是最好的方法,以及为什么。

+1

一个优点是'反身性';如果'+'不是一个重载成员函数,而是一个外部函数或者只有'obj + 1'是可能的,'obj + 1'和'1 + obj'将是可能的。 –

+0

@UchiaItachi应该指出的是,这需要你为*和*运算符+(int i,const Type&obj)和operator +(const Type&obj,int i)让对象暴露一个兼容的cast-operator)。同样,任意类型的返回值通常需要一个临时构造(谢谢RVO),而OP所要求的'operator <()'返回一个“bool”等价物。 – WhozCraig

+0

@WhozCraig是的,同意了。但只回答这个问题的前两句话:)无论如何感谢余下的! –

回答

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将失败,因为在调用成员函数之前不能将左转换应用于左侧。

是否适合像运营商<这样的成员函数实现?还是没有这个好处?

有些情况下,它并不重要,但它也不会提供任何优势。虽然这种说法并不完全正确......查找是不同的运营商以这种或那种方式实施,但在一般情况下,它并不重要。如果您处于重要的情况,那么需要关注更深层次的问题。

+0

当然,如果我编写外部函数来比较两种不同的类型,那么我必须编写一个单向轮和另一个轮... ...图示3D实例与实数类的比较示例。 (对不起,愚蠢的例子,因为我想不出一个更好的例子。)1 :) operator <(vector v,real mod)和2 :) operator <(double mod,real v)。我仍然需要编写两个函数,可能会让它们成为函数,不是吗? – user3728501

+1

@EdwardBird:几件事......首先,如果类型T可以隐式地从一个不同的类型S转换,则类型对称适用。在这种情况下,一个单一的实现'op <(T,T)'将用于这个目的T :: op <(T)','T :: op(S)'和'op(S,T)'。第二件事(可以通过仔细阅读前面的选项来注意)是因为作为成员实现的操作符必须是* first *成员,所以不能实现'operator <(double,T)'作为成员函数。参数(这是不对称的原因) –

+0

啊是的,我遇到了第二个问题:尝试乘以5:5的矢量*矢量不起作用,如果你实现vector.operator *(double)作为成员函数。 – user3728501

相关问题