[英]Defining your own explicit conversions
假設,如果不能通過顯式強制轉換(例如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.
}
對於用戶定義的類型,您可以定義類型轉換運算符 。 運算符的語法是
operator <return-type>()
您還應該知道,隱式類型轉換運算符通常會被皺眉,因為它們可能使編譯器有太多的回旋余地並導致意外的行為。 相反,您應該在類中定義to_someType()
成員函數以執行類型轉換。
對此不確定,但我相信C ++ 0x允許您指定explicit
式類型強制轉換,以防止隱式類型轉換。
在當前標准中,從您的類型到其他類型的轉換不能標記為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
如果這是您想要的,則可以定義轉換運算符,例如:
void foo (bool b) {}
struct S {
operator bool () {return true;} // convert to a bool
};
int main () {
S s;
foo (s); // call the operator bool.
}
盡管實際上不建議使用這種隱式轉換,因為一旦定義它,它可能會在您不期望的尷尬之處發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.