我想实现像c++
泛型这样的函数。除了整数之外,参数还应该支持char类型和任何其他类型。
void function t(int a[],int len);
如何用C语言实现这个?
答案 0 :(得分:3)
由于你没有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 *));
比较函数是唯一需要知道数据类型的代码,因此您只需要编写函数的通用部分一次。但是,您仍然需要为要操作的每种数据类型编写函数,如上所述。
答案 1 :(得分:2)
这是我认为在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);
答案 2 :(得分:0)
在C中执行此操作的惯用方法是传递void *。但是,你需要额外的信息来实际做任何事情。
答案 3 :(得分:0)
您可以尝试这样的事情:
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 ++完全不同,它是一个统一的功能,而不是每种类型的单独版本。