Как принять указатель на функцию с любым количеством параметров в качестве параметра в C и вызвать ее? - PullRequest
2 голосов
/ 06 августа 2020

Я создаю API хэш-карты. В этом API у меня есть функция hashmap_new(), которая создает новую хэш-карту (действует как конструктор). Я хочу, чтобы пользователь мог указать возможность указывать указатель на свою собственную функцию ha sh в качестве аргумента для hashmap_new().

Проблема, с которой я столкнулся, заключается в том, что это определяемое пользователем ha sh функция может иметь любое количество аргументов, причем в любом порядке. Например: некоторые функции ha sh требуют только данные в качестве аргумента, некоторые требуют данных и длины, в то время как другие требуют данных, длины и начального числа.

Мой код выглядит примерно так:

struct hashmap *hashmap_new(int capacity, uint64_t (*hash_fn)(const void *key, uint64_t len))
{
  ... // code for allocation and setting other variables
  map->hash_fn = hash_fn;

  return map;
}

После установки функции ha sh для моей карты я хочу вызывать ее из других частей моего кода, где это необходимо. Как я могу написать функцию hashmap_new(), которая принимает указатель на функцию ha sh, которая принимает любое количество аргументов, и как я могу вызвать эту функцию с таким количеством аргументов?

1 Ответ

4 голосов
/ 06 августа 2020

Объявите, что ваши функции ha sh принимают единственный аргумент void *. Затем для каждой функции определите структуру, содержащую параметры для этого ha sh, и внутри функции преобразуйте void * в указатель на соответствующий тип структуры.

Позже, когда вы вызовете ha sh, заполните экземпляр соответствующей структуры и передайте указатель на эту структуру функции.

...