如果我想foo在一個物件上呼叫函式thisThing(在 C# 行話中,這被稱為“接收者”,所以我在這里也叫它)并傳遞引數myStuff,我會這樣做:
thisThing.foo(myStuff);
超級簡單,沒什么奇怪的在這里進行。
如果我想將引數更改為yourStuff布林值b是否為假,我會這樣做:
thisThing.foo(b ? myStuff : yourStuff);
也非常簡單,基本使用三元運算子。
如果我想將接收器更改為otherThingifb為假,我會這樣做:
(b ? thisThing : otherThing).foo(myStuff);
有點奇怪,你可能不會經常這樣做,但這也不是什么瘋狂的事。
但是如果我想將被呼叫的函式更改為barifb為 false,我該怎么做呢?
我會這樣想:
thisThing.(b ? foo : bar)(myStuff);
但是,這當然行不通。
是否有一種簡單、整潔、高效的方式來執行此操作,最好不要冗余指定任何內容?
可能必須做出一些妥協,但關鍵是不必重復接收者和論點。所以以下作業:
if (b)
{
thisThing.foo(myStuff);
}
else
{
thisThing.bar(myStuff);
}
但是你必須重復接收者和論點。想象一下,thisThing并且myStuff是更復雜運算式的占位符。您可能希望首先將它們放在區域變數中,但這對復制有影響,并且如果您有很多引數,它就不會很好地發揮作用。
您也許可以將函式指標指向這些成員函式,然后執行類似的操作(b ? pointerToFoo : pointerToBar)(myStuff);,但處理函式指標往往會很混亂(想想函式多載),而且編譯器似乎不會正確優化它。但我很高興在這里被證明是錯誤的。
uj5u.com熱心網友回復:
您可以使用成員函式指標,但需要特殊語法才能通過指標呼叫函式:
struct X {
void foo() {}
void bar() {}
};
int main() {
X thisThing;
bool b = false;
(thisThing.*(b ? &X::foo : &X::bar))();
}
但是,我不建議像這樣實際使用它(除非問題中沒有顯示原因)。foo請注意,當或bar超載時,它不會像這樣作業。
無論如何,在我看來,您的其他示例也不是條件運算子的好用例。條件運算子不僅僅是 if-else 的等效替代品。它的用例略有不同。有時使用條件運算子來確定兩個運算式的共同型別。有時你不能使用 if-else。例如在初始化參考時:
int& x = a ? c : d; // cannot be done with if/else
我的建議是:與 if-else 相比,不要使用條件運算子來節省打字時間。if-else 和條件運算子之間的區別幾乎從來都不是您必須撰寫的代碼量。
uj5u.com熱心網友回復:
關于什么:
thisThing.foo_or_bar(b, myStuff);
和:
ThingClass::foo_or_bar(bool b, SomeType myStuff)
{
if (b)
foo(myStuff);
else
bar(myStuff);
}
uj5u.com熱心網友回復:
類似于@463035818_is_not_a_number的答案,但我不會使用指向成員 operator( .*) 的指標和所有括號,std::invoke而是使用:
struct X {
void foo() {}
void bar() {}
};
int main() {
X thisThing;
bool b = false;
std::invoke(b ? &X::foo : &X::bar, thisThing);
}
但是,就像原始答案一樣,如果包含函式多載,則不能使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/445344.html
上一篇:如何在Qt中使用子專案?
