Передача любого типа в качестве ... параметра
void f(/* no signature here */);
int main() {
f(1);
f(1.2);
f("Hello");
f(f);
}
void f(/* TBD signature */) {
;
}
Вызов функции любого типа прост. Делать что-то полезное с этим - сложная часть.
Пример печати без непосредственного указания типа с помощью _Generic()
для управления кодом.
GPrintf("The answer to everything ", GP(42), " or ", GP(42.0), GP_eol);
Основная идея заключается в создании функционально-подобного макроса, который использует _Generic
для выбора формы кода. Ниже приведен пример с квадратным корнем.
#define xsqrt(X) _Generic((X), \
long double: sqrtl, \
default: sqrt, \
float: sqrtf \
)(X)
xsqrt(42.0f); // calls sqrtf
xsqrt(42.0); // calls sqrt
xsqrt(42); // calls sqrt