簡體   English   中英

在C ++中聲明沒有隱式轉換的類型

[英]Declare types without implicit conversion in C++

我想聲明我自己的數字類型,就像unsigned int一樣,但我不希望隱式轉換類型。 我首先嘗試了這個:typedef unsigned int firstID; typedef unsigned int secondID;

但這並不好,因為這兩種類型只是unsigned int的同義詞,所以可以自由地互換。

我想這會導致錯誤:

firstID fid = 0;
secondID sid = fid; // no implicit conversion error

但這沒關系:

firstID fid = 0;
secondID sid = static_cast<secondID>(fid); // no error

我的理由是函數參數是強類型的,例如:

void f( firstID, secondID ); // instead of void f(unsigned int, unsigned int)

我在尋找什么機制?

謝謝

也許BOOST_STRONG_TYPEDEF表單boost / strong_typedef.hpp會有所幫助。

正如你所說:typedef命名錯誤(它應該是typealias(D已明確添加了typealias(我上次看過))

因此,您可以這樣做的唯一方法是創建兩個唯一的類。
我不是說你不能寫一個static_cast <>的專門化來做你想做的事情,但我認為(我還沒有考慮過這么多)這樣做會是一個壞主意(即使它合法),我認為更好的方法是讓每個類構造函數使用顯式的unsigned int(因此沒有自動轉換)。

 struct FID
 {
     explicit FID(unsigned int v): value(v) {}
     operator unsigned int() {return value;}
     unsigned int value;
 };

 class SID {/* Stuff */};

 FID   fid(1U);
 SID   sid(2U);

 doSomthingWithTwoSID(sid,SID(static_cast<unsigned int>(fid));

使構造函數顯式表示類型之間沒有自動轉換。
通過將內置的強制轉換運算符添加到unsigned int意味着它可以在任何需要int的地方使用。

你必須為它們編寫自己的類,重新實現你需要的所有操作符。

啊,我看到的阿達旅行者啊。

在C ++中執行此操作的唯一真正方法是聲明類。 就像是:

class first_100 {
public:
    explicit first_100(int source) {
        if (source < 1 || source > 100) {
           throw range_error;
        }
        value = source;
    };
    // (redefine *all* the int operators here)
private:
    int value;
};

您需要確保explicit定義int構造explicit以便C ++不會使用它來隱式轉換類型。 那樣做不行:

first_100 centum = first_100(55);
int i = centum;

但這樣的事情可能(假設你定義它):

int i = centum.to_int();
struct FirstID { int id; };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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