明日から使える boost/preprocessor/facilities/*

やったーC++ Advent Calendarすっかり忘れていました。
今日は数あるBoost.PPのマクロのうち今一つ何がしたいのか分からない連中にスポットを当ててみたいと思います。

BOOST_PP_IS_EMPTY

例えばコンパイルフラグとしてHOGEが定義されていたとします。gcc -DHOGEとか、#define HOGEとかそういう感じで。その時に、ある関数で何か特別なことをするには:

void f() {
…
#if defined HOGE
何か特別なこと
#endif
…
}

普通はこうですが、ワンライナーでやりましょう

#include <boost/preprocessor/control/expr_iif.hpp>
#include <boost/preprocessor/facilities/is_empty.hpp>

void f() {
…
BOOST_PP_EXPR_IIF(BOOST_PP_IS_EMPTY(HOGE), 何か特別なこと)
…
}

HOGEは、-DHOGEとあれば空に展開されるはずなので、BOOST_PP_IS_EMPTY(HOGE)は1になります。HOGEの定義がなければHOGEは展開されず、IS_EMPTYは0を返します。

BOOST_PP_IS_1

先と同じく、今度はHOGEが1と定義されていた場合:

void f() {
…
#if HOGE == 1
何か特別なこと
#endif
…
}

これは、

#include <boost/preprocessor/control/expr_iif.hpp>
#include <boost/preprocessor/facilities/is_1.hpp>

void f() {
…
BOOST_PP_EXPR_IIF(BOOST_PP_IS_1(HOGE), 何か特別なこと)
…
}

HOGEが1になるのであれば、何か特別なことがコードとして展開されます。

BOOST_PP_IS_EMPTY_OR_1

-DHOGEでも-DHOGE=1でもどちらでもOKとする場合:

#include <boost/preprocessor/control/expr_iif.hpp>
#include <boost/preprocessor/facilities/is_empty_or_1.hpp>

void f() {
…
BOOST_PP_EXPR_IIF(BOOST_PP_IS_EMPTY_OR_1(HOGE), 何か特別なこと)
…
}

BOOST_PP_INTERCEPT

struct hoge0 {}; struct hoge1 {}; … というのを量産したいとします。これはhogeNの後ろに{};があるので、BOOST_PP_ENUM_PARAMSではできませんね。そこでBOOST_PP_ENUM_BINARY_PARAMSを使います。

#include <boost/preprocessor/facilities/intercept.hpp>
#include <boost/preprocessor/repetition/enum_binary_params.hpp>

BOOST_PP_ENUM_BINARY_PARAMS(10, struct hoge, {}; BOOST_PP_INTERCEPT)

BOOST_PP_ENUM_BINARY_PARAMSはA1 a1, A2 a2, みたいなのを作るときによく使いますが、2番目のパラメータには数字いらんのじゃ、というときにBOOST_PP_INTERCEPTを入れてやると数字を消せます。
BINARYじゃないENUM系のマクロでも使えるので、

#include <boost/preprocessor/facilities/intercept.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
BOOST_PP_ENUM_PARAMS(8, YO BOOST_PP_INTERCEPT)! Check it out!

とすればYO , YO , YO , YO , YO , YO , YO , YO ! Check it out!になりますYO! Check it out YO!

BOOST_PP_EXPAND

BOOST_PP_EMPTY BOOST_PP_EMPTY BOOST_PP_EMPTY() () ()

これは、BOOST_PP_EMPTY BOOST_PP_EMPTY () () と展開されますが、ただこう書いただけではこれ以上展開されません。マクロの引数にしてやれば、もっと展開できます。そこで、

BOOST_PP_EXPAND(BOOST_PP_EMPTY BOOST_PP_EMPTY BOOST_PP_EMPTY() () ())

BOOST_PP_EXPANDを使って展開を促進できます。

BOOST_PP_IDENTITY

工事中

おわり

というわけ痒いところに手が届くfacilitiesディレクトリの中身を紹介しました。今まで微妙に回りくどいことをしていた人も、これで幸せになれるかな!なれないですね!

おまけ・クリスマスを無くす

なんかクリスマスを無くしてやるのが流行りらしいのでとりあえず置いときますね

#undef Christmas
#undef Xmas
#define Christmas
#define Xmas

最近流行りのアイドル(動画あり・音が鳴ります)

http://gs.dengeki.com/lovelive/
http://www.sunrise-inc.co.jp/lovelive/
http://www.lantis.jp/special/lovelive/
ラブライブ!です。
今のところキャラクターと1stシングルしかないのでアイドルならもっとアイドルっぽくグラビアとか欲しいところです。
School idol projectなんですから学校の話の漫画あってもええやろ!というか昨今のアイドルは漫画にもアイドルは漫画にもなりますしもっと燃料くださいといった感じなんですがまぁそんなことより花陽さん子供と目線一緒ってのはそれ多分褒めらてないんじゃないかなーと思います。あとことりさんはなんでそんなに人気ないのか分からないですね。
あとなんか色々書きたいところですがネタが足りない!!!
PVは力入ってるのに全然燃料がない大変アンバランスな状態なので、もっとみんなで文句言っていきましょう。

ラブライブ! 1stシングル「僕らのLIVE 君とのLIFE」 PV(ショートサイズ)

ラブライブ! 2ndシングル「Snow halation」/μ's PV(ショートサイズ)


※ちなみに現在のところ「LISP 漫画」でググると、まずLisp漫画がヒットします(というか普通これのことを言います)。

メタプログラミングの会に行ってきたような気がするような気がしないこともない気がするんじゃないかと思わないこともない気がする

今回はもうめんどいのでtwitterの私の発言をまとめる作業で行きたいですね。

実は直前まで色々他の作業してて、夜行バス乗り場(大阪駅桜橋口)まで行く時間がさし迫って大変やばい感じになってました。
駅に着いてホームに上がると「環状 遅れ約8分」とか案内が出てて、次の電車は4駅手前のアナウンスがあってどう考えてもやばい。というわけでJRの改札を出て地下鉄に行ったわけです。
ここに至ってようやく「中央」ドリーム号の意味を理解する。あのルートでもそこまで所要時間延びないのね。
新宿着きました。ここから新宿をうろつきます。
なぜそれを思い出したのかと言うと、うろついていると目に入ったのです。
なんかモンハンブースがあって、その前にハンターが群がっていました。お前らのほうがよっぽどモンスター。
地下でハトを見ました。どうやって入ってきたのか気になります。
変態タワー3号を見てから、しばらく適当に歩いてました。歌舞伎町行きました。傾いてました。あそこはなんか本当に宗右衛門町と同じ空気です。ところで朝マックは本当にケチくさいサイズですね。まぁバーガーはもともとケチくさいけど。
しばらくマクドで本を読んだり、ボーっと新宿駅に出入りする電車を眺めてました。なんとなく難波周辺にいるような気分でしたが、難波は南海以外の駅が全て地下にあるので電車は全く見えないですね。
また新宿をクネクネしていたわけですが、ここでふとそんな気分になりました。
そしてなぜか電車使わずに40分弱、靖国通りを歩いてました。細かい坂道とか本当に何も考えずに引いた道に道を重ねてばっかりでやばいですね。特に曙橋のあたりとかあの地形何がしたいのか分からない。サイクリングする分には飽きなさそうでいいですが。
しんどいというのと、あと2時間ほどでメタプロ会が始まるし、買うもの買う→昼食→会場まで移動の時間を考えると歩いていたのでは到底間に合いそうにないので中央線に乗ることに。
快速という感じのスピードじゃないですね。130km/hぐらい出してほしい。
結局秋葉原に来るわけです。ちゃんと恋チョコを買いました。昼食はラーメンにしました。
Boost.勉強会#1と同じビルだったので今度は迷わず行けました。
一番面白かったのはMetaOCamlかなー。あとハッシュタグの設定ミスってしまいました。
懇親会ではBoost.勉強会#3で発表したアレをもう一回発表してきました。bindとかほしいねーという話をいただきましたので、気が向いたら実装します。ちなみに https://patch-tag.com/r/digitalghost/pplambda/home に置いてあります。実は今回Chaos-PPで発表ネタを考えようとしていたのですが、気が付いたら前日だったので無理でした。二次会ではなぜかミルホ鑑賞会が始まりました。本当に意味が分からない。どうしてこうなった。23時40分のバスに乗るため、23時10分には会場を出たかったのですが、最後に注文した酒がちょうど23時10分に出てくるというすばらしい演出のため、23時20分に出たわけです。走りましたよ。
バスに乗ったと思ったらすぐにサービスエリアでびっくりしました。というか乗ってすぐに寝てしまったようです。
足柄サービスエリアのファミマですが、コンビニの敷地外までレジの列が延びていました。ここで一本だけ残っていた生茶と一袋だけ残っていた普通のカラムーチョとファミチキを買いました。
しかし酒によっても車には酔わないのがこの私。
あの駅周辺から漂ってくる匂いは本当に腹へってるときにはたまらないです。匂いに殺される。
恋チョコです。
それがこれです。
s/起きてから/帰ってから/ 結局サービスエリアで買ったカラムーチョは家でRedBullといっしょにおいしくいただきました。

Boost.勉強会#3で適当なことをしゃべってきました

あぁどうしよう。今回は大阪開催なので旅程がなくて書くことがないのであった。終わり。

などというだけではあんまりなので、まぁ千里中央の地形はやばいですね。前にも第一回GC勉強会のときに行きましたが、会場の建物に入るまでやっぱり迷いました。地上なのにぐぐる地図が役に立たないというすばらしい地形ですね。あと誰も御堂筋線が地下鉄だと信じてくれないのですが、一つ誤解があって、御堂筋線は新大阪以北だと江坂までで、そこから先は北大阪急行線であって地下鉄じゃないんです。よってみなさんはほとんど地下鉄には乗っていないわけです。西中島南方から先まで乗るべきです。

全発表はここから見れます。実況のまとめはいつもの【Twitter】ブー速zakブログで。私は気になった話の感想を書きます。私の発表の話の補足とかは後ほど別の記事として用意します。

エラーハンドリング

の話は、聞いててふと関数呼び出しの際に例外から戻り値に変換できたらなーとか思いましたが、これはもっとこの考えを推し進めて、エラーかもしれない戻り値(ぬるぽ・optional系)/例外/errno + get_last_error/errno + out引数その他様々なエラー処理は、送出する側/捕捉する側で別々の方法で扱えるべきなんですよ!errnoで通知したものをcatchで捕捉できたりしてもいいじゃないですか!
前に「エラーは捕捉する側が都合のいい手段で捕捉できるべきだ」とか書きましたが、常にエラーを捕捉する側が、送出する側のとったエラー通知の方法に合わせないといけないわけです。先に書きましたが、送出する側が例外なら捕捉はcatchでしかできないですし、ぬるぽなら if (!f()) ですし、errnoならget_last_errorなど。「なんでお前はthrowしてないんや」「おいぃoptional使えやボケが!」とかそういう戦争が日々繰り広げられていて、大量のエラーハンドリングラッパが世の中に量産されている。大変不毛です(不毛といってもすっぽすっぽ先生のことではないです)。
だからまぁ、送出側と捕捉側を分離できる仕組みがあればいいですねという話です。

Goodbye Doost!

Dなんとか言語のA先生はRange中二病?大丈夫なんでしょうか。あと懇親会会場の道すがらの話で、コミッタの中では日本人勢が一番マジキチなんじゃないかと思いました。大丈夫なんでしょうか。まぁ、俺のD言語がこんなにまともなわけがない。

Boost.Build

よーしパパビルドしちゃうぞーという気持ちですね。そんなに難しくなさそうでよかったです。
あとRypplと組み合わせて何かできないかな。まぁ私Ryppl全然調べてないですけど。

Boost.PropertyMap

前回のshared_ptrに引き続き、動機から話を積み上げていく大変に分かりやすいお話で非常に明解で分かりやすい(←これで使い方あってるかな)お話でした。まぁ私全然使う機会ないですけど。

二次会

懇親会は大変賑っていました。道化師さんredboltzさんkikairoyaさんは昔話に花を咲かせていました。ちょっと年齢層の違う話なので私はよく分からなかったです。

二次会ではalohakunさんが「みんなもっと残念な感じのキモオタだと思ってた。がっかりした。」「(アキラさんに)ほんとイケメンですよねー」「(めるぽんさんに)ほんと勝ち組ですよねー」「うちの会社は高齢化が激しいのに、社長に同年代だと思われている」などとずっと悲しくなるトークをしていました。そういえば一次会の席でもなつたんさんに説教していたという話を聞いてますね…。まぁそんななかでも私は期待通りの感じだったそうです。やったねたえちゃん!

そういえばHiNaさんって見あたらなk(ry

有界の会の話

今回は節約して夜行バスで行きました(行く前に用事があったり飲んでたりしましたがその話は省略)。
裕福な私は東京行く手段といえばいつも新幹線で、夜行バスとかそんな安物の乗り物は初めてだったのでとりあえず8000円ぐらいの割とゆったりめのヤツにしてみました。そのチョイスは割と当たってて、あれより狭いと、触ってるとドロドロに融けるナマコみたいな感じで私は死にます(※ただし融けたナマコは放置していると再生します)。ただまぁイスが大変残念な感じで、とても腰が痛い。寝られないのです。椅子はかなり大きく倒せましたがどうもきまりが悪く、終いには俯せになってみたりもしてみた結果、ただ苦しいだけでした。あと枕。枕が必要です。
座席の上の棚に鞄が収まらなくて悲しいとか、そういうこともありました。ご存知の方も多いですが、私の鞄は別段大きいわけでもないですし、重いわけでもないです。どこにでもよくある普通の鞄です。荷物も大して入ってませんので、膨らんでなんかいませんし、なんで入らないのか大変疑問です。棚をもっと大きくしてください。
そんなわけで江戸のバスターミナルに着きました。これが朝の7時半です。会が始まるのが11時。3時間半をどうすればいいのでしょう。こういう時間はどこかに保管しておきたいので誰かそういうwebストレージサービスを作ってください。
ちょっと歩き回った挙句、早々に国鉄江戸駅構内のスタバで過ごしました。同じく時間を潰している人が多い中、カウンター席の二人の女性客の間に一つ空いている席を見つけ、居心地が悪いことを承知で居座りました。大変居心地が悪いですし、そもそもスタバとか私のような、ゴミに近い人間が行くところじゃないのでもっとそういう人間が過ごしやすい空間作りをしてください。
10時前になるとぼちぼち「そろそろ出よう」などのpostが増えてきましたので、私も向かうことにしました。また地下鉄です。本当にこの町は節操なくて、田舎を整備せずにコンクリートのジャングルにしただけで悲しいですね。そもそも地下鉄なんて人間が利用することを想定したものじゃなくて、企業などの生体部品を運んだりするのが主目的なんだから仕方ないのでしょうが。human-frendlyな交通機関の登場が期待されます。
会場最寄り駅ギロッポンからはカーチーローツウと、カーチーからのターレーカーエスでシューゴーバーショのルービーまでツーチョクでした。1階ロビーに着いた私は、開始まで30分ほど時間があるのでRedBullを買いにビル内4階にあるローソンに行くべく、適当なエスカレータを探しはじめました。
探していると、「ECO NAVI CAFE」というスペースがあって、ガラス張りの部屋の中では大量の照明をギンギラギンに焚いている様子が見受けられました。大変ECOいですね。
さて、エスカレータを見つけたので乗りました。すると着いたのは3階でした???2階はどこに行ったのですか???人間さんに優しくなさすぎませんか?????あとエスカレータは、一階ごとに次の階に行くためのエスカレータを探さないといけないオサレ系のつくりになっていて、ちょっと君この作りはオサレ系頭悪い作りですねって思いました。
それからとりあえずローソンに着いてRedBullを買いました。ローソンの近くにエレベータがあったので、それで一階まで降りました。すると車用のエントランスに出ました???私がいた一階はどこに行ったのですか???
適当に入口を探して入ると、同会参加者であるアキラさんから声をかけられました。どうやらここが一階のようです。だったらさっき一階だと思っていたのは一体どこなんですか???
実は最初に着いた場所は2階のロビーだったらしく、つまり私が地下から上がるために乗ったエスカレータは、なんと2階に通じていたのでした。帰りに確認すると、エスカレータからちゃんと到達不能の一階部分が見えました。ちょっと本当にもうこのビル頭おかしいの本格派ですね。
話を戻して、アキラさんと一緒にいた方はpepshisoさんでした。どうやらみんな正しい待ち合わせの場所が分からないようです。困りました。
ところでこれ以上集合するまでの話を書くと森タワーの悪口しか出てこないので、次行きましょう。そういえばこんさんはそのへんのビルをワープしまくっていたようですが、ズーヒルにはそういう装置もあるんですね。もうダンジョンですね。
会場は新しいGREEのオフィスということだったのですが、ビルのセキュリティが尋常じゃなくて、しょうむないアホ面をした一般人はビルのエレベータすら動かせない素敵仕様でした。会の内容はあんなに適当なのに!
さて肝心の会の内容ですが、私はだいたい自分の席でプリプロセッサをいじってましたので、面白い話は他の参加者の日記とか見ればいいんじゃないでしょうか?まぁいつものことですね。
会の後は二次会です。ビル内の店は満席とかそんな感じで無理っぽかったので秋葉原に行くことになりました。六本木から秋葉原なので、メトロ日比谷線に乗るわけです。皆様の愛あるwait-free改札によって切符を買っている間に見事六本木駅に放置された私がそこにいました。どうやら江戸の若者は電車の料金を調べるのが面倒臭いのでSuicaなんだそうです。江戸は怖いですね。
さて、一人あとから秋葉原に着き、アキラさんに迎えに来ていただいて(あの時はお手数おかけしました)店の前で待っていた皆さんと合流を果たして二次会です。煮魚とか焼き魚おいしかったです。あと秋刀魚の刺身でしたっけ、あれも脂乗ってておいしかったです。食べ物以外の話としては、まぁC++の話とか、メタプログラミングの話とかしました。
私の帰りの夜行バスの時間が迫ってきたので、そろそろ失礼するついでに全員解散ということになりました。帰りも夜行バスで、行きのバスよりは寝心地が良かったです。まぁ、寝心地とか関係なくなるほど疲れてたという可能性はありますが。
ところでこの日記を見返してみると内容の2/3が始まるまでの話でお前は一体何をしに行ったんだ。

新型scope guard

以前にも何回か書いているスコープガードネタですが(これこれこれ)、http://d.hatena.ne.jp/faith_and_brave/20100921/1285049653 とか http://d.hatena.ne.jp/gintenlabo/20100921/1285084859 から、なんかtwitterで話のネタになってたので、ちゃんとC++0xで使えるカッコイイスコープガード作りましたよ!


#include <iostream>
#include <functional>
#include <utility>

#define PP_CAT(a, b) PP_CAT_I(a, b)
#define PP_CAT_I(a, b) a ## b

template<typename F>
struct scope_exit_t {
scope_exit_t(F & f) : f(f) {}
~scope_exit_t() { std::cout << "by lvalue: "; f(); }
private:
F & f;
};

template<typename F>
struct scope_exit_t<F&&> {
scope_exit_t(F && f) : f(f) {}
~scope_exit_t() { std::cout << "by rvalue: "; f(); }
private:
F f;
};

struct scope_exit_helper {
template<typename F>
scope_exit_t<F&&> operator->*(F && f) const {
return scope_exit_t<F&&>(std::forward<F>(f));
}
};

#define scope_exit_base auto PP_CAT(scope_exit_, __LINE__) = scope_exit_helper() ->*
#define scope_exit scope_exit_base [&] ()
#define scope_exit_2 scope_exit_base

struct fun_obj {
void operator()() { std::cout << "fugafuga\n"; }
};

void f() {
std::cout << "私はカモメ\n";
}

void g(int x) {
std::cout << x << "\n";
}

int main() {
scope_exit { std::cout << "hogehoge\n"; };
scope_exit { std::cout << "piyopiyo\n"; };
scope_exit_2 f;
fun_obj x;
scope_exit_2 x;
scope_exit_2 std::bind(g, 10);
}

scope_exitマクロはラムダ式用、scope_exit_2はそれ以外の関数オブジェクトなどにも使える汎用定義。たいへんいけめんですね。