我想實現一個類似於c++
泛型的函數。除了整數,參數還應該支持char類型,以及任何其他類型。一個類似於C++通用的C函數
void function t(int a[],int len);
如何在C語言中實現?
我想實現一個類似於c++
泛型的函數。除了整數,參數還應該支持char類型,以及任何其他類型。一個類似於C++通用的C函數
void function t(int a[],int len);
如何在C語言中實現?
在C語言中這樣做的習慣做法是傳遞void *。但是,您需要額外的信息才能真正做到這一點。
既然你沒有模板用C像你這樣的C++你有幾個不同的選擇,這可能是合適的根據手頭的任務:
使用預處理器和創建基本宏,例如您的基本MIN
/MAX
類型的宏,它只是簡單地包裝幾個<
和>
操作。
編寫不同版本的特定數據類型的函數 - function_int(int...)
,function_char(char...)
等
寫一個通用的函數,該函數在數據作爲void*
,不知道實現細節,以及函數指針,被作用於數據的函數調用,並知道如何操作這些數據。
在這種情況下,看像bsearch
的函數,其中所述搜索關鍵和陣列是void *
類型的,以及比較函數傳遞用於特定類型的數據:
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
比較函數是這是唯一需要知道數據類型的代碼片段,因此您只需要編寫函數的通用部分一次。但是,您仍然需要爲每個要操作的數據類型編寫一個函數,就像上面的要點一樣。
這是一種我相信在書C Unleashed中描述的技術。這本書大概比我能夠從記憶中複製出來的更優雅一些。
你可以有一個包含文件是這樣的:
/* function.tmpl */
#ifndef FUNCTION
#define FUNCTION_PASTE(X,Y) X ## _ ## Y
#define FUNCTION(X) FUNCTION_PASTE(function, X)
#endif
void FUNCTION(TYPE) (TYPE a[], int len) {
/* do something */
}
然後,可像這樣:
#define TYPE int
#include "function.tmpl"
#undef TYPE
#define TYPE double
#include "function.tmpl"
#undef TYPE
和通話功能是這樣的:
int a[4];
FUNCTION(int)(a, 4);
double b[5];
FUNCTION(double)(b, 5);
你可以嘗試這樣的事情:
enum data_type { CHAR_TYPE, INT_TYPE };
void function t(void* buf, size_t len, enum data_type type) {
int* int_ary;
char* char_ary;
if (type == CHAR_TYPE) {
char_ary* = buf;
...
} else if (type == INT_TYPE) {
int_ary* = buf;
...
}
}
它很容易出錯而且容易出錯,但它可以工作。它不完全像C++,因爲它是一種統一的功能,而不是每種類型的獨立版本。
在C++中,您有模板。在C語言中,最接近你的是宏... eek。 – Mysticial 2012-07-11 00:47:53
C沒有模板。你想要這個功能做什麼,具體是什麼?請編輯您的問題以包含具體示例。 – 2012-07-11 00:48:08
'void *'是你需要使用的。還有一些聰明(但小心!)的編程。 – 2012-07-11 00:51:55