2014-12-13 53 views
2

我只是想知道,如果我们可以给两个或多个参数来操作的重载< <C++重载<<操作多个参数

个例将更加明确:

anyType   operator<<(arg p1, arg p2) 
{ 
DoSomethingWith(p1); 
DoSomethingWith(p2); 
return (*this); 
} 

而且使用它是这样的:

anyVar << anyVar2, anyVar3; 

感谢

+0

注意:您的例子是使用两个运营商(运营商<<和operator,(逗号)) – 2014-12-13 15:02:17

回答

4

不,那是不可能的。

你可以来会是这样的最接近:

anyType   operator<<(std::pair<arg, arg> p) 
{ 
    DoSomethingWith(p.first); 
    DoSomethingWith(p.second); 
    return (*this); 
} 

anyvar << std::make_pair(a1, a2); 

或者,你可以做一些更复杂的有效咖喱调用您的运营商,具有anyType::operator<<(arg)返回一个临时对象,它只是持有到它的论点并且实现不同的tempObject::operator<<(arg)其实际上完成这项工作。然后你可以称之为anyvar << arg1 << arg2。我真的怀疑,除了学习经验之外,是否值得这样做。

类似于该风格的东西通常用于“构建器”模式,但使用成员函数而不是显式运算符。这很有用,因为您可以安排有效地使配置参数与顺序无关。

+0

谢谢!我想我会用std :: pair来做,这有点棘手,但对我来说看起来不错 – taof 2014-12-13 15:10:43

+1

我认为在这一点上,可能明智地问*为什么*你认为'<<'运算符是函数的正确选择为此行为过载。非标准的操作符重载是非常难以维护和调试的。 – 2014-12-13 15:47:21

0

不,你不能这样做。一个二元运算符只能被重载以获得两个操作数,既可以作为具有一个参数的成员函数,也可以(除了赋值运算符)具有两个操作数的非成员。

如果你想要一些更像功能的东西,写一个函数。

或者,你可以写你的运营商允许链接,就像对I/O流的标准重载做:

anyType & operator<<(arg p) { // return a reference, not a copy 
    DoSomethingWith(p); 
    return *this; 
} 

anyvar << anyVar2 << anyVar3; // Does the thing to each variable, in turn. 
+0

好的,谢谢你!但我没有给出一个好的解释,我想用p1和p2做不同的事情,所以我不能那样做。 我会像Rici说的,用std :: pair或者像你说的那样简单地用一个函数 – taof 2014-12-13 15:09:54