可以使用任意型別的型別就是 void* 了。只需要強制轉換型別即可,任意使用。編譯器並不會嚴重警告。我們不應該濫用。
void*並沒有過多約束,是萬能的型別。
執行任意操作都可以編譯通過
需要自己管理指向的物件
char szbuf[4] = "";
void* p = szbuf;
*(int*)p = 1234567889;
*(long
long*)p = 12345678891212121ll; //隱患
所以,我們自己做乙個接受任意型別的類。為了能夠任意型別賦值,該類應該與型別無關。
any a = 12
;a = "1234"
; any b = a
;
給出實現。
定義乙個儲存資料型別的類。該類是派生類。
class baseholder
virtual ~baseholder()
virtual baseholder* clone() = 0;
};templateclass holder : public baseholder
~holder()
baseholder* clone() override
public:
t _value;
};
建議不要使用void*來持有物件,因為當any物件拷貝給另外乙個any物件時,void*並沒有方法提供資料型別以供拷貝,並且釋放物件時也並不安全,有記憶體隱患,如下例。
class
text
~text()
};void* p = new text;
delete p;
template
any(const valuetype& value)
any(const any& any) : _pvalue(any._pvalue->clone())
template
any& operator=(const valuetype& value)
any類的建構函式和賦值函式(賦值函式不能馬虎賦值,this物件的值是any型別時會無限遞迴)。
型別轉換函式。
template
valuetype* anycast()
template
valuetype& anyrefcast()
dynamic_cast需要虛函式的支援,我們的儲存資料型別的類已經提供。注意,強制型別轉換引用是會丟擲異常的。
any類全部**
class baseholder
virtual ~baseholder()
virtual baseholder* clone() = 0;
};template
class holder : public baseholder
~holder()
baseholder* clone() override
public:
t _value;
};class any
any(const any& any) : _pvalue(any._pvalue->clone())
~any()
template
any& operator=(const valuetype& value)
template
valuetype* anycast()
template
valuetype& anyrefcast()
private:
baseholder* _pvalue;
};
測試**
int main()
catch (std::bad_cast)
cout
<< c.anyrefcast() << endl;
cout
<< d.anyrefcastlong
long>() << endl;
a = string("hello");
cout
<< a.anycast() << endl;
cout
<< *a.anycast() << endl;
return
0;}
go語言學習 Any型別
由於go語言中任何物件都滿足空介面inte ce,所以inte ce看起來像是可以指定任何物件的any型別,如下 var v1 inte ce 1 將int型別賦值給intreface var v2 inte ce string 將string型別賦值給inte ce var v3 inte ce ...
c 任意變數型別獲取相關
需要實現乙個函式,template int get unique id t t 傳入任意型別的變數,變數型別相同時,返回值id相同,且如果為不同的變數型別返回的id不同 例如 get unique id 100 引數為int型別,返回值為 1,get unique id 1000 引數同樣為int型...
C 中any 的用法
我們在一級考試系統維護的 檢查中,有乙個地方一直有警告。use any to test whether this ienumerable system.data.datarow is empty or not.警告位置 region 程金鵬 頁碼格式 2015年12月9日15 58 35 頁碼格式 ...