2

我想实现一个像c++泛型这样的功能。除了整数,参数还应该支持 char 类型,以及任何其他类型。

void function t(int a[],int len);

如何用 C 语言实现?

4

4 回答 4

3

由于您在 C 中没有像 C++ 那样的模板,因此您有几个不同的选项,根据手头的任务可能适合:

  • 使用预处理器并创建一个基本宏,例如您的基本MIN/MAX类型宏,它简单地包装了一些<>操作。

  • 为特定数据类型编写不同版本的函数 - function_int(int...),function_char(char...)等。

  • 编写一个将数据作为 a 的通用函数void*,不知道实现细节,以及一个由函数调用的函数指针,该函数作用于数据并知道如何操作该数据。

    在这种情况下,请查看类似 的函数bsearch,其中搜索键和数组的类型为void *,并且为特定类型的数据传递了一个比较函数:

    void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
                  int (*compar)(const void *, const void *));
    

    比较函数是唯一需要知道数据类型的代码,因此您只需编写函数的通用部分一次。但是,您仍然需要为要操作的每种数据类型编写一个函数,就像上面提到的那样。

于 2012-07-11T01:00:49.163 回答
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);
于 2012-07-11T01:02:51.193 回答
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;
        ...
    }
}

这是hackish且容易出错,但它可以工作。它与 C++ 不完全一样,因为它是一个统一的函数,而不是每种类型的单独版本。

于 2012-07-11T01:03:18.203 回答
0

在 C 中执行此操作的惯用方法是传递一个 void*。但是,您需要额外的信息才能对其进行实际操作。

于 2012-07-11T00:56:16.510 回答