c 任意變數型別獲取相關

2021-09-24 10:54:37 字數 1453 閱讀 8734

需要實現乙個函式,template int get_unique_id(t t),傳入任意型別的變數,變數型別相同時,返回值id相同,且如果為不同的變數型別返回的id不同(例如 get_unique_id(100)  引數為int型別,返回值為  1,get_unique_id(1000) 引數同樣為int型別,返回值為 1, get_unique_id('a') 引數為char型別返回值為 2,get_unique_id('d')引數為char型別,返回值為 2...)。

想法一:

首先想到的實現方法:

可以在模板函式get_unique_id()中定義乙個static靜態變數 初值為static int i = -1; 在外邊定義乙個全域性變數int g_cout = 0;

利用模板函式編譯時,相同型別會使用同乙個函式,不同型別會生成不同函式的機制進行生成(例如 get_unique_id(2) 和 get_unique_id(3) 都是整型,使用的是同乙個函函式get_unique_id(int ),,而get_unique_id('c') 模板生成的函式是 get_unique_id(char)。考慮到每個函式裡都有乙個static int i 變數,通過外部全域性變數的計數就能為每乙個不同變數,返回

乙個不同的id;**實現如下:

int g_count = 0;

templateint get_unique_id(t t)

templateint get_unique_id()

int main()

輸出結果:

可以實現需求

想法二:

可以通過typeid關鍵字識別出不同型別,再經過map查詢,返回不同的id

實現如下:

std::mapg_type_name;

int g_count = 0;

templateint get_unique_id(t t)

return iter->second;

}templateint get_unique_id()

return iter->second;

}int main()

執行結果如下:

同樣也能實現上述功能。

感覺上第一種較簡單明瞭,不過會生成非常多static 全域性靜態變數,而且不具有可操作性,不能清空id(如果需要清空id,需要將所有型別的函式都執行一遍才能做到將每個函式中的static int unique置為-1),重新生成。

第二種想法,可以隨時釋放清空掉map中的內容,重新生成id序。

C 任意型別Any

可以使用任意型別的型別就是 void 了。只需要強制轉換型別即可,任意使用。編譯器並不會嚴重警告。我們不應該濫用。void 並沒有過多約束,是萬能的型別。執行任意操作都可以編譯通過 需要自己管理指向的物件 char szbuf 4 void p szbuf int p 1234567889 long...

php 獲取變數的型別

gettype 獲取變數的型別 描述string gettype mixed var 返回 php 變數的型別 var.warning 不要使用 gettype 來測試某種型別,因為其返回的字串在未來的版本中可能需要改變。此外,由於包含了字串的比較,它的執行也是較慢的。使用 is 函式代替。返回的字...

獲取變數資料型別

獲取變數資料型別 1 獲取檢測變數的資料型別 typeof可用來獲取檢測變數的資料型別 var num 10 console.log typeof num number var str abc console.log typeof str string var flag true console.l...