Вам будет трудно сделать это в C, потому что C статически типизирован и не имеет информации о типах во время выполнения.Каждая строка кода C должна точно знать, с каким типом она имеет дело.
Тем не менее, C поставляется с изящным и часто используемым препроцессором макросов, который позволяет вам (помимо прочего) определять новые функции, которые отличаются толькостатический тип.Например:
#define FOO_FUNCTION(t) t foo_function_##t(t a, t b) { return a + b; }
FOO_FUNCTION(int)
FOO_FUNCTION(float)
Это дает вам 2 функции, foo_function_int и foo_function_float, которые идентичны, кроме имени и сигнатуры типа.Если вы не знакомы с препроцессором Си, имейте в виду, что в нем есть много забавных ошибок, поэтому прочтите его, прежде чем приступать к переписыванию фрагментов вашей программы в виде макросов.
Не зная, как выглядит ваша программаЯ не знаю, насколько выполнимым будет для вас такой подход, но часто препроцессор макросов может помочь вам притвориться, что вы используете язык, который поддерживает универсальное программирование.