2012-02-24 30 views
4

一些運營商如&&||執行短路評估。另外,當使用參數調用函數時,所有參數都是在調用函數之前構造的。如何在用戶定義的函數中實現短路評估?

例如,採取以下三種功能

bool f1(); 
bool f2(); 
bool f3(bool, bool); 

如果我叫

if(f3(f2(),f1()))//Do something 

然後f3調用之前都f2f1的返回值進行評估。 ,如果我用了(常規)operator||代替f3,比上面的代碼就相當於

if(f2()||f1())//Do something 

如果f2計算結果爲真f1將不進行評估。

我的問題是:是否有可能有f3(用戶定義的函數採取兩個布爾值)的行爲方式相同?如果沒有,是什麼讓operator||如此特別?

+0

如果你內聯它可能是可能的......否則絕對不是。 – 2012-02-24 01:00:39

回答

2

如果f3()取得函數結果的值,則不適用。

但是,如果它需要函數的地址(或者更通用地將它的輸入視爲函數)而不是結果,那麼f3()可以決定是否需要調用該函數。

template<typename F1, typename F2> 
bool f3(F1 const& f1, F2 const& f2) 
{ 
    return f1() || f2(); 
} 

bool f1(); 
bool f2(); 

int main() 
{ 
    f3(&f1, &f2); 
} 
0

你的前提是不正確的。超載operator||operator&&總是評估他們的論點;沒有短路。

有關此問題的討論,請參閱More Effective C++的第7項。

+0

我知道他們這樣做。我不是在說重載'operator ||'我正在談論默認的'operator ||'。我在說:'operator ||'有2個參數,但使用短路,是否可以對2個參數的用戶定義函數產生相同的影響? – Malabarba 2012-02-24 01:09:22

+0

@BruceConnor:好的。在這種情況下,答案是:基元上的'operator ||'和'operator &&'是特殊的,因爲標準是這樣說的。我不認爲有任何方法可以用任意函數來模擬它。 – 2012-02-24 01:11:08

0

你不能比較||運算符和類似的功能。 ||是邏輯運算符,它會檢查給定的值,如果左操作數評估爲false,則不需要檢查正確的值。

在函數的情況下,f1()或f2()返回的任何值都對f3()有效。即使函數參數採用bool參數,也無法爲函數參數啓用「邏輯操作數」功能。