2013-05-08 50 views
10

是否有可能改變的if()的行爲,使:C++「超載」的if()語句

class Foo { 
    int x; 
}; 

Foo foo; 
if(foo) 

僅進行如果x值是其他的東西比零?或...

將顯式的用戶定義的類型轉換爲int工作/將是一個適當的方法?或...

是否最好做類似if(foo.getX())的東西?

+4

如果您需要這在C++ 03下,你可能想看看進入安全布爾成語:http://www.artima.com/cppsource/safebool .html – Yuushi 2013-05-08 03:13:04

回答

22

您可以通過定義operator bool()你的對象轉換爲一個布爾值:

explicit operator bool() const 
{ 
    return foo.getX(); 
} 

explicit關鍵字可以防止隱式轉換從Foobool。例如,如果您不小心將foo置於算術表達式foo + 1中,則如果您將operator bool()聲明爲explicit,則編譯器可能會檢測到此錯誤,否則foo將轉換爲bool,即使並非有意也是如此。

在形式

operator TypeName() 

的一般,成員函數(帶有可選explicitconst限定符)是轉換算子。它允許你將你的課程轉換爲TypeName指定的任何類型。在另一個方向上,一個參數的構造函數允許你施放任何類型到類:

class Foo { 
    Foo(int x); // convert int to Foo 
    operator bool() const; // convert Foo to bool 
    int x; 
}; 

它定義了你的類隱式轉換。如果可能,編譯器會嘗試應用這些轉換(例如,它對內置數據類型所做的操作,例如5 + 1.0)。您可以聲明它們爲explicit以抑制不需要的隱式轉換。

+7

明確說明可能會更好。 – chris 2013-05-08 02:54:09

+1

你絕對**想標記這個明確的,除非你想讓人們做像'!myClass'這樣的事情。 – templatetypedef 2013-05-08 02:55:54

11

可以定義操作員將對象轉換爲bool

class Foo 
{ 
    int x; 
public: 
    operator bool() const 
    { 
    return x > 0; 
    } 
}; 

但這個可以有,因爲隱式轉換的意想不到的後果bool當你不想要的轉換不會發生。例如

int x = 42 + Foo(); 

C++ 11允許你聲明的轉換操作符爲explicit,然後只允許在某些情況下隱式轉換,如if語句中解決了這個問題。

explicit operator bool() const // allowed in C++11 

現在

int x = 42 + Foo(); // error, no implicit conversion to bool 
int x = 42 + static_cast<bool>(Foo()); // OK, explicit conversion is allowed