You can do that since C11 using _Generic. https://en.cppreference.com/w/c/language/generic:
True but its very clumsy for large number of parameters. Even more importantly, its not forward compatible. For example, cbrt() cant reliably expanded to support bigints or any private types.