2012-10-24 74 views
8

比方說,我有一個C++有兩個功能類像三元運算符和函數簽名

class MyClass 
{ 
    bool Foo(int val); 
    bool Foo(string val); 
} 

是否有可能使用三元運算這樣

MyClassInstance->Foo(booleanValue?24:"a string"); 

,並有MyClass不同的功能根據booleanValue的值調用?

+2

這是有趣的... – mauris

+6

你試過編譯並運行它,看看會發生什麼? –

+0

這甚至沒有編譯。編譯器會抱怨三元運算符的不同類型。 –

回答

21

不與三元運算符。三元表達式的類型是其第二個和第三個操作數的常見類型;如果他們沒有共同的類型,你就不能使用它。因此,只要用普通的if聲明:

if (booleanValue) 
    MyClassInstance->Foo(24); 
else 
    MyClassInstance->Foo("a string"); 
5

否。要執行重載解析,編譯器會詢問「booleanValue?24:"a string"的類型是什麼?」。這個問題無法回答。

+0

在編譯時不能回答*(不是我的down-vote順便說一句 - 只是提出一個小建議來改進答案) –

+0

@Paul在C++表達式中只有編譯時類型,時間。談論其他事情沒有意義。 –

+0

是的,我知道,重點是可以設想*你可以決定哪個函數動態調用,即在運行時,但是對於C++,你需要在編譯時知道類型。 –

7

類型的三元條件表達式是常見的類型其中兩個兩個操作數都是騙子­版本­ tible。你可以肯定地而不是執行「動態重載決議」,你似乎暗示。

由於intchar const *沒有常見的類型,因此代碼甚至不會編譯(因爲您在測試時確實會注意到­)。

(您可以用decltype高興得不得了知道,三元條件的使用,因爲在std::common_type特質類模板的實現這些語義的準確,在一起。)

(如果條件被稱爲靜態sizeof(int) != 7,那麼你可以使用模板SPE ­ CIA ­補腎中藥寫看起來相似的代碼,確實執行條件重載決議,但當然靜態)。

5

不,這是不允許的。

重載是編譯時,所以它不能在運行時以這種方式工作。

這不是在代碼中的常見你想做到這些,但有時的iostream有做類似的願望:

os << (condition ? var1 : var2)

其中VAR1和VAR2有不同的類型。這也是行不通的。

你可以這樣做:

MyClassInstance->Foo(booleanValue ? boost::any(24) : boost::any("a string"));