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