tgmath
http://alohakun.blog7.fc2.com/blog-entry-624.html#comment
別に標準の範囲で実装できるんじゃないかなぁと思います。
#include <math.h> #include <complex.h> #define mysin(X) \ ((sizeof(X)==4) ? sinf(X) : \ (sizeof(X)==8) ? \ (sizeof(X*_Complex_I)==8) ? csinf(X) : sin(X) : \ (sizeof(X)==16) ? csin(X) : \ (sizeof(X)==12) ? sinl(X) : \ (sizeof(X)==24) ? csinl(X) : assert(0)); int main() { float f; double d; long double l; _Complex float cf; _Complex double cd; _Complex long double cl; f = mysin(f); d = mysin(d); l = mysin(l); cf = mysin(cf); cd = mysin(cd); cl = mysin(cl); }
こんな感じで確認。
i@u ~/test> gcc mytgmath.c -S i@u ~/test> grep call mytgmath.s call sinf call sin call sinl call csinf call csin call csinl
型の昇格とかも考慮に入れるのはまぁできるんじゃないかなぁと。
あーでも共変ぽくなってる戻り値型とかどうなってるかはよく知りませんていうかそのへんのルール把握してないので上のはあやしいかもです。