2012-02-24 11 views
4

&&および||などの演算子によっては、短絡の評価が行われます。また、引数を指定して関数を呼び出すと、その関数を呼び出す前にすべての引数が構築されます。例えばユーザー定義関数で短絡評価を実装する方法は?

、私は

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

を呼び出す場合f3が呼び出される前に、次にf2f1両方の戻り値が評価され、以下の三つの機能

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

を取ります。 f2がtrueと評価された場合、私が使用した場合しかしは、(通常の)operator||の代わりf3、上記のコードは

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

f1に相当するであろうよりも評価されません。

f3(2つのブール値をとるユーザー定義関数)は同じように動作しますか?そうでない場合、operator||は何のために特別なものになるのでしょうか?

+0

インラインならば可能でしょうか...そうでなければ、絶対にありません。 –

答えて

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

私は彼らが知っている。私はオーバーロードされた '演算子についてのことではありません||'私はデフォルトの '演算子||'について話しています。私は言っている: '演算子||'は2つの引数を取るが、短絡を使用する、それは2つの引数のユーザー定義関数に同じ効果を持たせることができるのだろうか? – Malabarba

+0

@BruceConnor:ああ。その場合、答えは:プリミティブ上の 'operator ||'と 'operator &&'は、標準でそういう意味で特別なものです。私は、これを任意の関数でエミュレートする方法はないと思います。 –

0

あなたは||を比較できません。オペレータとそのような関数。 ||論理演算子であり、与えられた値をチェックします。左辺のオペランドがfalseであると評価された場合、右辺をチェックする必要はありません。

関数の場合、f1()またはf2()が返す値はf3()に対して有効です。 boolパラメータをとっても、関数パラメータに "論理オペランド"機能を有効にする方法はありません。

関連する問題