関数ポインタで型情報の異なる関数を実行する -キャスト-
C言語の関数ポインタは振る舞いを動的に変えるのに便利。
だけど、関数の型情報に縛られるのは何とかできないかと調べていたら、関数ポインタをキャストしてしまえば、どんな型の関数でも実行できることを知った。
ポインタ虎の巻〜関数ポインタの使い方
#include <stdio.h> int add(int x, int y) { return x + y; } int square(int x) { return x * x; } float div(float x, float y) { return x / y; } int main() { void (* pfunc)(void); int x = 10; int y = 4; printf("x = %d, y = %d\n", x, y); pfunc = (void (*)())add; printf("pfunc(add) : %d\n", ((int (*)(int, int))pfunc)(x, y)); pfunc = (void (*)())square; printf("pfunc(square) : %d\n", ((int (*)(int))pfunc)(x)); pfunc = (void (*)())div; printf("pfunc(div) : %.2f\n", ((float (*)(float, float))pfunc)((float)x, (float)y)); return 0; }
実行結果
$ ./a.out x = 10, y = 4 pfunc(add) : 14 pfunc(square) : 100 pfunc(div) : 2.50
実行結果から正しい結果が返ってきているのがわかる。
けど、これってpfuncは抽象化できているけれども、実行するときに元々の具体的な型情報でキャストしなくちゃいけないから、イマイチ。
結局、型情報に縛られちゃってる。
うーん、使いどころがあるかな?