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:

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

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

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.