これは、Cプリプロセッサの専門家向けです。
enum
いくつかの識別子のリストを使用して宣言し、後でswitchステートメントチェック中に識別子がリストに含まれているかどうかを宣言するにはどうすればよいですか?
必要なものの例:
typedef enum { e1, e2, e3, e4, e5, e6 } e;
e x;
switch (x) {
#if DECLARED_IN_ENUM (e1)
case e1 : ...
#endif
/* etc. */
}
Boostシーケンスを使用して、列挙型のコンマ区切りリストに展開することを考えましたが、シーケンスに特定のトークンが含まれているかどうかを後で確認するにはどうすればよいですか?
編集:私がブーストでできたことは:
#define e1 e1
#define e2 e2
#define e3 e3
#define e4 e4
#define e5 e5
#define e6 e6
#define E (e1)(e2)(e3)(e4)(e5)(e6)
typedef enum { BOOST_PP_SEQ_ENUM(E) } e;
e x;
switch (x) {
#if defined (e1)
case e1 : ...
#endif
/* etc. */
}
それはあまり美しくありません、そして私は次のようなものを好みます:
#define E (e1)(e2)(e3)(e4)(e5)(e6)
typedef enum { BOOST_PP_SEQ_ENUM(E) } e;
e x;
switch (x) {
#if BOOST_PP_SEQ_CONTAINS (e1,E)
case e1 : ...
#endif
/* etc. */
}
しかし、どのようBOOST_PP_SEQ_CONTAINS
に実装できますか?