比方說,我有一個C++有兩個功能類像三元運算符和函數簽名
class MyClass
{
bool Foo(int val);
bool Foo(string val);
}
是否有可能使用三元運算這樣
MyClassInstance->Foo(booleanValue?24:"a string");
,並有MyClass
不同的功能根據booleanValue
的值調用?
比方說,我有一個C++有兩個功能類像三元運算符和函數簽名
class MyClass
{
bool Foo(int val);
bool Foo(string val);
}
是否有可能使用三元運算這樣
MyClassInstance->Foo(booleanValue?24:"a string");
,並有MyClass
不同的功能根據booleanValue
的值調用?
不與三元運算符。三元表達式的類型是其第二個和第三個操作數的常見類型;如果他們沒有共同的類型,你就不能使用它。因此,只要用普通的if
聲明:
if (booleanValue)
MyClassInstance->Foo(24);
else
MyClassInstance->Foo("a string");
否。要執行重載解析,編譯器會詢問「booleanValue?24:"a string"
的類型是什麼?」。這個問題無法回答。
在編譯時不能回答*(不是我的down-vote順便說一句 - 只是提出一個小建議來改進答案) –
@Paul在C++表達式中只有編譯時類型,時間。談論其他事情沒有意義。 –
是的,我知道,重點是可以設想*你可以決定哪個函數動態調用,即在運行時,但是對於C++,你需要在編譯時知道類型。 –
類型的三元條件表達式是常見的類型其中兩個兩個操作數都是騙子版本 tible。你可以肯定地而不是執行「動態重載決議」,你似乎暗示。
由於int
和char const *
沒有常見的類型,因此代碼甚至不會編譯(因爲您在測試時確實會注意到)。
(您可以用decltype
高興得不得了知道,三元條件的使用,因爲在std::common_type
特質類模板的實現這些語義的準確,在一起。)
(如果條件被稱爲靜態如sizeof(int) != 7
,那麼你可以使用模板SPE CIA 補腎中藥寫看起來相似的代碼,確實執行條件重載決議,但當然靜態)。
不,這是不允許的。
重載是編譯時,所以它不能在運行時以這種方式工作。
這不是在代碼中的常見你想做到這些,但有時的iostream有做類似的願望:
os << (condition ? var1 : var2)
其中VAR1和VAR2有不同的類型。這也是行不通的。
你可以這樣做:
MyClassInstance->Foo(booleanValue ? boost::any(24) : boost::any("a string"));
這是有趣的... – mauris
你試過編譯並運行它,看看會發生什麼? –
這甚至沒有編譯。編譯器會抱怨三元運算符的不同類型。 –