Обычно в C99 вы можете добиться перегрузки функций (количество аргументов, а не перегрузка типов) с помощью VA_ARGS и некоторого макроса, например:
#define THIRD_PARAMETER(_1,_2,_3,...) _3
#define NOTHING
например:
void pr1(int x);
void pr2(int x, int y);
#define pr(...) THIRD_PARAMETER(__VA_ARGS__, pr2, pr1, NOTHING)(__VA_ARGS__)
(я добавляю макрос NOTHING
, чтобы C99 не жаловался на нулевой аргумент, передаваемый ...
, когда я вызываю pr(100)
для печати 100
, я хочу, чтобы моя программа была полностью совместима с C99)
Но проблема в том, что pr не является функцией, поэтому его нельзя назначить указателю на функцию внутри структуры:
// this is a dynamic array
struct array {
// ...
void (*insert)(struct array * a, ...);
// ...
};
Предположим, у меня есть 3 версии вставки: single_insert, множественный_интервал, range_insert, которые имеют 3,4,5 аргумента соответственно. Как я могу реализовать перегрузку функции (количество аргументов) внутри структуры C99? это возможно?