Cでもジェネリックが使える
関数オーバーロードみたいな感じ
前に任意の型を引数に取る関数の実装を行ったが、なかなか無理があった。
あれではまだ満足出来ない。
与えた引数の型からマクロが呼び出す関数を変えるようにしたい。
_Generic
は関数マクロに適用出来る。
_Generic
を使う事で、引数の型に応じて呼び出す関数を変えられる。
文法は
#define マクロ名(引数) _Generic((判断に用いる引数), 引数の型: 型が一致した時に呼び出す関数)(関数に渡す引数))
の形式で書く。
たとえば
#include <stdio.h>
#define YOSHINANI_PRINT(x) _Generic((x), \
int: printf("%d\n", x), \
char: printf("%c\n", x), \
char *: printf("%s\n", x))
このように書くとYOSHINANI_PRINT
に渡した値の型によってprintf
の引数をよしなにして出力してくれる。
便利じゃん