Есть очень сильные проблемы с этим требованием.C ++ допускает перегрузку для собственных функций C ++, но не для связей языка "C".Спецификации связывания [dcl.link] §6 гласит:
Не более одной функции с конкретным именем может иметь связь на языке C.
А ваша попытка шаблонирования эквивалентнаявно объявив:
extern "C" void fortran_function(double *);
extern "C" void fortran_function(float *);
Это объявило бы две разные функции со связью языка C и одним и тем же именем => явным образом запрещено стандартом C ++.
Основанием для этого является использование общей реализации name mangling для создания идентификатора функции, содержащего типы аргументов, чтобы компоновщик мог их идентифицировать.Связывание языка Си точно избегает искажения имен, чтобы обеспечить взаимодействие с функциями языка Си.Это немедленно устраняет любую возможность перегрузки.
В любом случае, вы не сможете определить функции 2 C или Fortran с одинаковыми именами и с использованием других параметров.Лучшее, что я могу себе представить, - это ручное манипулирование :
extern "C" void fortran_function_double(double *);
extern "C" void fortran_function_float(float *);
Возможно, вы могли бы использовать макросы для облегчения нескольких объявлений, но я действительно недостаточно опытен в метапрограммировании макросов ...