読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

IS_EMPTYマクロを自作してみた

自作と書いていますが、BOOST_PP_IS_EMPTYのソースを読んでほとんどマネています。また gcc 4.8.2 でのみテストしています。

#define EMPTY()
#define DEF_COMMA0 _,1 EMPTY
#define COMMA0() ,0
#define TUPLE2_ELEM1_I(f,s) s
#define TUPLE2_ELEM1(t) TUPLE2_ELEM1_I t
#define IS_EMPTY_I(x) TUPLE2_ELEM1((DEF_ ## x()))
#define IS_EMPTY(x) IS_EMPTY_I(x COMMA0)


#define A
#define B()

false
IS_EMPTY(0)
IS_EMPTY(1)
IS_EMPTY(HOGE)
IS_EMPTY(FOO BAR)
true
IS_EMPTY()
IS_EMPTY(A)
IS_EMPTY(B())

実行結果

false
0
0
0
0
true
1
1
1

このアルゴリズム(?)は、「空文字列の場合は (_, 1) というタプルを作り、タプルの1番目の要素1 を得る。そうでない場合は(DEF_なんちゃら, 0)というタプルを作り、タプルの1番目の要素0を得る。」というものです。なんちゃらの部分はIS_EMPTYにユーザーが渡す引数なので何になるか予想できません。そこで思い切ってタプルの0番目の要素を捨ててしまうんですね。

BOOST_PP_IS_EMPTYのソースを読みましたが、こういうコードを書けるのはホント変態だと思います。いったい何を考えているのでしょうか・・・。

参照