PCPで列挙体を定義する。
高木です。こんばんは。
先日から話題にしているPCP: C++ Preprocessorですが、これからは少しずつ深堀していきたいと思います。
今回は列挙体の定義についてです。
CやC++の列挙体は便利ですが、モダンな言語に比べれば機能的にはショボいもんです。
とくに、列挙定数と文字列の相互変換ができないのが不便ですね。
こうした問題はPCPでメタプログラミングすることですぐに解消できます。
具体的には次のようにします。
1 2 3 4 5 6 7 8 9 10 | <?php pcp_enum('day_name', [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', ]); |
上記のように記述して、PHPで処理すれば、
1 2 3 4 5 6 7 8 9 10 | enum day_name { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; |
上のようなコードが出力されます。
列挙定数の定義はPHPの配列として記述していますので、pcp_enum関数の実引数としてじかに定義するのではなく、いったん変数にしてやれば、他の用途にも使いまわせます。
具体的には、整数値と文字列の相互変換とかです。
整数値と文字列の相互変換はPHP上だけでできるわけではありません。
PHP上でそれができるということは、列挙定数と文字列の相互変換を行うCやC++の関数を自動生成することは容易にできます。
今回は列挙体の定義を紹介しましたが、同様にして構造体の定義なんかもできます。
構造体をPHPの配列として定義できれば、別の言語とデータ交換するためのマーシャラーなんかも簡単にできますね。
とりあえず、今回はこの辺にしておきます。
しばらくはこのネタが続くと思いますので、興味のある方はお付き合いください。
興味のない方はどうかスルーしてください。