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

型の昇格とかも考慮に入れるのはまぁできるんじゃないかなぁと。

あーでも共変ぽくなってる戻り値型とかどうなってるかはよく知りませんていうかそのへんのルール把握してないので上のはあやしいかもです。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h