2014-12-13 117 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