列挙子に関連付けられた情報やアクションにこれと同様の手法を使用しています。これはかなりうまく機能しますが、すべての定数を2回効果的にリストする必要があるという小さな問題があります。1回はenum宣言のヘッダーファイルに、もう1回はルックアップテーブルのソースファイルにあります。おそらくプリプロセッサのトリック(Boost.Preprocessorは許容されます)を使用して、列挙型定数や関連する値などを1か所に入力し、必要なものをすべて取得できるように「自動化」する良い方法があるかどうか疑問に思っています(おそらくルックアップ構造体自体も生成されます。
可能であれば、漠然と列挙型の構文を維持する方法をお勧めします。たとえば、のようなものDECLARE_ENUM(...) {E_CONST(...), E_CONST(...)};
。これを実現するためにヘッダーファイルをダブルインクルードするというアイデアに言及しているサイトを見たことがあります。つまり、次のようなものです。
#include "my_enum.hpp"
#undef ENUM_HPP // undefine the include guard
#undef E_CONST
#define E_CONST(...) /* something here */
#include "my_enum.hpp"
...しかし、そのテクニックがここでどれほど役立つかはわかりません。特に、ヘッダーで定義されている列挙型だけではありません。ルックアップテーブル構造体も、他のいくつかの関連する列挙型とサポート関数とともにそこにあります。
私はすでにマクロを使用してルックアップテーブルの要素を定義しています(列挙型定数の順序を並べ替えてもエントリが常に正しい場所にあるように、C99初期化子を使用しています)。
複数の列挙型に適用できるソリューションもいいでしょう。
私はこれにclang(Apple-3.1)を使用しており、移植性については特に心配していません。
どこかで捨てようとしたのですが…なぜうまくいかなかったのか思い出せません。多分私はタイムマシンでそれを見つけることができます...