Прямой ответ: это невозможно. Кроме того, вам следует избегать написания таких суперфункций, которые работают с несколькими типами, если только вы не сможете по-настоящему обобщить код и применить полиморфизм. В Си это часто связано с указателями на функции. В противном случае нет ничего плохого в написании нескольких функций, каждая из которых действует на один тип. На самом деле, это должно быть предпочтительнее суперфункций.
Вот базовый пример (не очень полезный, но простой):
#include <stdio.h>
typedef int less_function(void*, void*);
struct foo
{
int data;
};
int foo_less(void* a, void* b)
{
struct foo* f1 = a;
struct foo* f2 = b;
return f1->data < f2->data;
}
int find(void* search_array, void* element, int num, int element_size, less_function* less)
{
int j = 0;
char* search_pos = search_array;
for (j=0; j < num; ++j, search_pos += element_size)
{
// if current element == element to find
if (!less(search_pos, element) && !less(element, search_pos) )
return j;
}
return -1;
}
int main()
{
struct foo my_array[10] = { {0}, {1}, {2}, {3}, {4}, {5}, {6}, {123}, {7}, {8} };
struct foo search_element = {123};
// outputs 7
printf("%d\n", find(my_array, &search_element, 10, sizeof(struct foo), foo_less) );
}
В приведенном выше коде вы можете видеть, что у меня нет такого кода: если этот тип является целым числом, сделайте это, если это число с плавающей запятой, сделайте это, если это объект struct foo, сделайте это и т. Д. Вместо этого мы полагаемся на указатели на функции, чтобы обеспечить настраиваемое поведение для сравнения типа передаваемого объекта.
qsort также делает это и является хорошим примером для рассмотрения. Она очень похожа на функцию поиска выше, за исключением того, что ее компаратор не просто возвращает истину / ложь, основываясь на том, меньше ли первый объект, чем другой: он похож на strcmp и возвращает 0, -1 или + 1.