簡體   English   中英

定義自己的顯式轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM