2008-09-24

プリプロセッサメタプログラミングのすすめ

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:

Anonymous said...

仕事には使えませんけど。
そんなモノを勧められても困ります。

江添亮 said...

何、ほんの軽い冗談ですよ。