C語言 模板化 template 程式設計萌芽

2021-10-10 01:23:06 字數 2242 閱讀 5243

實際大型專案中的原始碼結構,其設計優雅、精密。閱讀這樣的**,給我的感覺,就像在讀一部長詩,雖然篇幅巨集大,但卻又不顯得冗餘、枯燥。不由得也想親自嘗試寫一首小詩。於是就選擇梳理一下最近比較感興趣的乙個部分——模板(泛化)程式設計。

實現一種**結構,可以完成不同型別的需求。比如,乙個求和計算,不僅可以實現int變數的求和,也可以實現float變數之間的求和,類似於c++中的模板,等等。

vc++6.0;

widows 7 proffessional

有可能實現模板的方式有兩種:

1. void *的合理應用;(先不做分析)

2. 應用帶引數的巨集定義

在實際大型專案中,應用帶引數的巨集這樣的方式進行介面實現是非常常見的。

巨集定義在**編譯過程中,就是無條件的文字替換,不像函式那樣,會有資料型別的強制要求和檢查:

#include

#define sume(a, b) (a+b)

void

main()

以上同樣可以輸出正確的結果,相較於普通函式,它的靈活性顯而易見,這也就增加了c語言模板實現的可能性;當然,正因為它缺少了函式那樣的型別檢查等安全措施,所以使用過程中不免會有一些安全隱患,需要尤為注意。

當然,模板不可能只侷限於求和這樣的簡單計算,所以一種更為靈活的結構需要被廣泛實現。以往參與的專案中,絕大多數是基於如下的實現:

#include

/* 所謂的泛化程式設計,其實也少不了函式的實現體,只不過,將結構類似的實現體放在一起,便於維護管理而已

*//*

為了在該檔案中呼叫

*/#define sum(type, a, b) sum_##type(a, b)

/* 以下實際上編譯出來是實現體,所以包含的標頭檔案裡不需要加上條件編譯,否則,第二個包含將無意義,因為已經在之前包含過了,不會再被包含

*/#define _type int

#define _func sum_int

#include

"sum_core.h"

//事實上,這個檔案裡才是核心實現

#define _type float

#define _func sum_float

#include

"sum_core.h"

void

main()

//#ifndef sum_cfg_h

//#define sum_cfg_h

_type _func

(_type a, _type b)

#undef _type

#undef _func

//#endif

按照我們正常的思路,.h中不是應該必須加上條件編譯指令:

#ifdef	sum_cfg_h

#deine sum_cfg_h

#endif

以防止同一標頭檔案被過度呼叫嗎?

是的,正常情況是這個樣子。但是在這裡的目的是為了完成不同條件下的介面實現,如果加上以上條件編譯指令,則會導致乙個錯誤:

明明已經包含了標頭檔案,確仍然報未定義的錯誤。其原因就是main.c中雖然包含了兩次,但是因為有條件編譯限制,防止過度包含,所以第二次實際上是沒有用的。這也就導致了函式未定義的錯誤。

以上已經可以算得上是乙個模板的雛形,但是為了更好地維護c語言模組化程式設計的特性,也為了便於後期維護,可以將如下部分另外加入到乙個模組中,比如sum_cfg.h:

#define _type	int

#define _func sum_int

#include

"sum_core.h"

//事實上,這個檔案裡才是核心實現

#define _type float

#define _func sum_float

#include

"sum_core.h"

這樣的話,配置、實現和呼叫相分離,**結構更加清晰,後期維護起來也將更便捷一些。

以上只是將自己遇到過的感興趣的部分做了乙個簡單的梳理,關於模板程式設計仍然有許多質的探索的地方,比如,利用void *實現模板化。

C 類模板template

類模板 對於功能相同而資料型別不同的一些函式,可以定義乙個可對任何型別變數進行操作的函式模板,在呼叫函式時,系統會根據實參的型別,取代函式模板中的型別引數,得到具體的函式 includeusing namespace std template class compare numtype max nu...

C 類模板 template

類模板與函式模板的定義和使用類似。有時,有兩個或多個類,其功能是相同的,僅僅是資料型別不同,如下面語句宣告了乙個類 class compare int intmax intmin private int x,y 其作用是對兩個整數作比較,可以通過呼叫成員函式max和min得到兩個整數中的大者和小者。...

C 類模板 template

類模板與函式模板的定義和使用類似。有時,有兩個或多個類,其功能是相同的,僅僅是資料型別不同,如下面語句宣告了乙個類 class compare int intmax intmin private int x,y 其作用是對兩個整數作比較,可以通過呼叫成員函式max和min得到兩個整數中的大者和小者。...