PCPで列挙体を定義する。

高木です。こんばんは。

先日から話題にしているPCP: C++ Preprocessorですが、これからは少しずつ深堀していきたいと思います。

今回は列挙体の定義についてです。

CやC++の列挙体は便利ですが、モダンな言語に比べれば機能的にはショボいもんです。
とくに、列挙定数と文字列の相互変換ができないのが不便ですね。

こうした問題はPCPでメタプログラミングすることですぐに解消できます。

具体的には次のようにします。

上記のように記述して、PHPで処理すれば、

上のようなコードが出力されます。

列挙定数の定義はPHPの配列として記述していますので、pcp_enum関数の実引数としてじかに定義するのではなく、いったん変数にしてやれば、他の用途にも使いまわせます。
具体的には、整数値と文字列の相互変換とかです。

整数値と文字列の相互変換はPHP上だけでできるわけではありません。
PHP上でそれができるということは、列挙定数と文字列の相互変換を行うCやC++の関数を自動生成することは容易にできます。

今回は列挙体の定義を紹介しましたが、同様にして構造体の定義なんかもできます。
構造体をPHPの配列として定義できれば、別の言語とデータ交換するためのマーシャラーなんかも簡単にできますね。

とりあえず、今回はこの辺にしておきます。
しばらくはこのネタが続くと思いますので、興味のある方はお付き合いください。
興味のない方はどうかスルーしてください。