2011-08-31 62 views
2

假設,如果從一種類型的另一種類型的轉換是無法通過顯式轉換e.g static_cast,就可以定義明確的轉換運營商呢?定義自己的顯式轉換

編輯

我正在尋找一種方法來定義顯式轉換操作符爲以下幾點:

class SmallInt { 

public: 

    // The Default Constructor 
    SmallInt(int i = 0): val(i) { 
     if (i < 0 || i > 255) 
     throw std::out_of_range("Bad SmallInt initializer"); 
    } 

    // Conversion Operator 
    operator int() const { 
     return val; 
    } 

private: 
    std::size_t val; 

}; 

int main() 
{ 
    SmallInt si(100); 

    int i = si; // here, I want an explicit conversion. 
} 
+0

顯式轉換運算符就是返回目標類型的方法。或者我錯過了什麼? –

回答

3

對於用戶定義的類型,您可以定義type cast operator。對於運營商的語法

operator <return-type>() 

你也應該知道,隱式類型轉換操作符,一般在因爲它們可能讓編譯器太多的迴旋餘地,並導致意外的行爲皺起了眉頭。相反,您應該在類中定義to_someType()成員函數來執行類型轉換。


不知道這一點,但我相信的C++ 0x允許你指定一個類型轉換爲explicit防止隱式類型轉換。

+0

確實! http://www2.research.att.com/~bs/C++0xFAQ.html#explicit-convertion – Dawson

+0

@Toolbox哪些編譯器實現了C++ 11的這一特性?我不認爲MSVC++ 2010有。 –

+0

@Seth Carnegie根據http://gcc.gnu.org/projects/cxx0x.html,顯式轉換運算符在GCC 4.5中可用。我沒有能夠自己測試這個。 – Dawson

0

如果這是你想要的,你可以定義轉換操作符,比如什麼:

void foo (bool b) {} 

struct S { 
    operator bool() {return true;} // convert to a bool 
}; 

int main() { 
    S s; 
    foo (s); // call the operator bool. 
} 

雖然並不推薦使用,因爲一旦確定,可能會出現尷尬的地方,隱式轉換,你別指望它。

+0

是的,但是我可以將其變爲僅接受顯式轉換嗎? – Jason

+0

我在C++ 0x中這麼認爲,正如上面的答案所述。你爲什麼不定義一個'to_XXX'成員函數? –

+1

請注意隱式轉換爲bool。 http://stackoverflow.com/q/6242296/46642 –

2

在目前的標準,從您的類型轉換爲不同的類型不能標記explicit,這是有意義達到一定程度:如果你想顯式轉換可以隨時爲實現轉換的功能:

struct small_int { 
    int value(); 
}; 
small_int si(10); 
int i = si.value(); // explicit in some sense, cannot be implicitly converted 

話又說回來,它可能沒有多大意義,因爲在即將到來的標準,如果你的編譯器支持的話,您可以標記轉換操作符爲explicit

struct small_int { 
    explicit operator int(); 
}; 
small_int si(10); 
// int i = si;     // error 
int i = (int)si;    // ok: explicit conversion 
int j = static_cast<int>(si); // ok: explicit conversion