I understand C11 generics for one-parameter functions, like this: (from here)
#define acos(X) _Generic((X), \ long double complex: cacosl, \ double complex: cacos, \ float complex: cacosf, \ long double: acosl, \ float: acosf, \ default: acos \ )(X)
But, it seems to be a pain for functions with two arguments, you need to nest calls to _Generic
, which is really ugly; Excerpt from the same blog:
#define pow(x, y) _Generic((x), \ long double complex: cpowl, \ double complex: _Generic((y), \ long double complex: cpowl, \ default: cpow), \ float complex: _Generic((y), \ long double complex: cpowl, \ double complex: cpow, \ default: cpowf), \ long double: _Generic((y), \ long double complex: cpowl, \ double complex: cpow, \ float complex: cpowf, \ default: powl), \ default: _Generic((y), \ long double complex: cpowl, \ double complex: cpow, \ float complex: cpowf, \ long double: powl, \ default: pow), \ float: _Generic((y), \ long double complex: cpowl, \ double complex: cpow, \ float complex: cpowf, \ long double: powl, \ float: powf, \ default: pow) \ )(x, y)
Is there a way to have more human being-readable generics for multiparameter functions, like this for instance :
#define plop(a,b) _Generic((a,b), \ (int,long): plopii, \ (double,short int): plopdd)(a,b)
Thanks in advance for your replies. The basic idea would be having a macro wrapper for _Generic
.
Given that the controlling expression of _Generic
is not evaluated, I'd suggested applying some arithmetic operation that does the appropriate type-combining, and switching on the result. Thus:
#define OP(x, y) _Generic((x) + (y), \ long double complex: LDC_OP(x, y), \ double complex: DC_OP(x, y), \ ... )
Of course this only works for certain cases, but you can always expand out those for which the "collapsed" type is not helpful. (This would let one take care of array-N-of-char vs char *
, for instance, as with the linked printnl
example, and then if the combined type is int
, one can go back and check for char
and short
.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With