W.I.S. Laboratory
menu-bar

C


C言語でダックタイピングのようなことをしてみる

JavaC#SwiftKotlinなどでよくやるダックタイピングもどきを、Cでやってみた。
Cはオブジェクト指向型言語ではないのだが、オブジェクト指向プログラミングできないわけではない。
構造体に関数そのものを入れることはできないが、関数ポインタを構造体のメンバにすることで、擬似的に関数に「型」を付けることができ、メソッドチェーン(foo.barfunc() とか foo->barfunc() みたいなの)で関数呼び出しができるようになる。
型があれば関数の引数になれるので、「関数を他の関数へ渡す」ということができるようになる。

しかしCには関数テンプレートのような機能がないため、「どんな型の関数でも引き受けるよ」的な関数を作ることはできない。
そこでインターフェースの代わりに1つの構造体を作り、それを親とした複数の子構造体を作成する。
構造体の継承は、親の構造体を子の構造体メンバとして格納すればOKだ。
あとは適当にコンストラクタ代わりの関数を作る。
インスタンスを生成して、メンバ(関数ポインタ)にそのインスタンス用の関数アドレスを代入し、インスタンスを返せばコンストラクタになる。

各インスタンスをインターフェース型へアップキャストしてから、インターフェース型を引数に取る関数へ投げ、その関数で受け取った構造体内の関数を呼び出せばダックタイピングだ。
C++やD言語の関数テンプレートのように「構造体なら何でも来い」というわけではないが、JavaやC#にも負けないほどのダックタイピングもどきがCでも書ける。
ちなみにここまで律儀に書かなくても、Cなら構造体定義がひとつあれば似たようなことができる。


[ 戻る ]
saluteweb