C 任意型別Any

2021-07-13 09:56:45 字數 2308 閱讀 1832

可以使用任意型別的型別就是 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 頁碼格式 ...