http://pc11.2ch.net/test/read.cgi/tech/1217008269/994
994 名前:デフォルトの名無しさん[sage] 投稿日:2008/09/24(水) 16:37:07
enum{
ONE=1,
TWO=2,
THREE=4,
FOUR=8
};
ってフラグ定数を宣言したい時いちいち=で設定しないでもenumと同じ使い心地の定数の宣言できないだろうか
勝手に2倍2倍にしてくれるenumみたいな
プリプロセッサメタプログラミングにかかればこの通り。
#include <boost/preprocessor/repetition/enum.hpp>
#include <boost/preprocessor/array/size.hpp>
#include <boost/preprocessor/array/elem.hpp>
#define HITO_PP_ENUM_MEMBER( z, n, data ) \
BOOST_PP_ARRAY_ELEM(n, data) = 1 << n
#define HITO_PP_SHIFT_ENUM( name, array ) \
enum name { \
BOOST_PP_ENUM( BOOST_PP_ARRAY_SIZE( array ), HITO_PP_ENUM_MEMBER, array ) \
}
HITO_PP_SHIFT_ENUMは、enumの名前と、メンバのarrayを引数に取る。以下のように使う。
#define HITO_ENUM_IDENTIFIERS (10, (ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN) )
HITO_PP_SHIFT_ENUM( foo, HITO_ENUM_IDENTIFIERS ) ;
#undef HITO_ENUM_IDENTIFIERS
プリプロセスの結果、以下のコードが生成される。
enum foo { ONE = 1 << 0 , TWO = 1 << 1 , THREE = 1 << 2 , FOUR = 1 << 3 , FIVE = 1 << 4 , SIX = 1 << 5 , SEVEN = 1 << 6 , EIGHT = 1 << 7 , NINE = 1 << 8 , TEN = 1 << 9 } ;
以上。
2 comments:
仕事には使えませんけど。
そんなモノを勧められても困ります。
何、ほんの軽い冗談ですよ。
Post a Comment