Trick C 巨集函式與模板類

2021-09-26 08:00:08 字數 1053 閱讀 2178

看這個**:

#include 	

#include

#include

#include

using namespace std;

#define declare(type, var) type var

int main()

g++編譯會報錯:

map_m.cpp:13:34: 錯誤:巨集「declare」傳遞了 3 個引數,但只需要 2 個	

declare(map, msi);

^ map_m.cpp: 在函式『int main()』中:

map_m.cpp:13:5: 錯誤:『declare』在此作用域中尚未宣告

declare(map, msi);

vector那句**不報錯,而map那句**報錯。原因是巨集函式declare接收兩個引數,而如果把map傳入,那麼編譯器預處理會把map<>裡的逗號視作巨集函式的分隔符,也就是拿到了三個引數:

mapint>

msi儘管前面兩個是語義無法解釋的,但是在巨集函式引數個數校驗的環節就失敗了。解決辦法,比較簡單。那就是typedef。

typedef map msi;	

declare(msi, msi);

當然在c++11以後,也可以使用using。

using msi = map;	

declare(msi, msi);

注意編譯的時候,g++加選項-std=c++11 。

也許你說,我根本不會定義乙個declare這樣的巨集函式。類似的需求也可以用模板函式來實現。當然,我這裡只是舉例子,但是我相信你可能有機會接觸到類似介面的巨集函式。使用的時候慎重就可以了。

另外再談一下c++名詞的慣用稱呼:巨集函式,其實叫函式巨集更合適,因為從中文偏正短語的角度講,後面的是中心語。巨集函式,本質是巨集,而不是普通函式。同樣模板類,也應該叫做類模板,因為它本質是定義的模板,而不是類。

當然了,後者相對繞口,大家怎麼順耳怎麼來吧。

函式模板與類模板(模板類)

什麼是泛型程式設計?泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。模板分為函式模板和類模板 下面我們就來說說函式模板 函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的型別版本 格式 template 返回值型別 函式名 引數列表 templatet1 ...

模板 函式模板與類模板

模板 template 是乙個將資料型別引數化的工具。模板分為函式模板和類模板兩種。在定義模板的時候不說明某些函式引數或者資料成員的型別,而將它們的資料型別作為模板引數。在使用模板時根據實參的資料型別確定模板引數即資料型別,從而得到模板的乙個例項。函式模板 function template 函式模...

函式模板與類模板

c 提供的函式模板可以定義乙個對任何型別變數進行操作的函式,從而大大增強了函式設計的通用性。使用函式模板的方法是先說明函式模板,然後例項化成相應的模板函式進行呼叫執行。函式模板的一般說明形式如下 template 模板形參表 返回值型別 函式名 模板函式形參表 其中,模板形參表 可以包含基本資料型別...