繁体   English   中英

AC函数类似于C ++通用

[英]A C function similar to C++ generic

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

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

如何用C语言实现呢?

由于您没有像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);

在C语言中,惯用的方法是传递void *。 但是,那么您需要额外的信息才能真正对其进行任何操作。

您可以尝试这样的事情:

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 ++完全不同,它是一个统一的函数,而不是每种类型的单独版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM