Preprocessor

Boost.Preprocessor の可変長マクロ引数対応

これはBoost Advent Calendar 2011の5日目の記事です。さて、Boostも徐々にC++11対応が進んでいまして、その中には当然、Boost内で最も利用されている、超有名かつ超重要、某社のサーバでも利用されているという純粋関数型言語C/C++プリプロセッサ用拡張ライ…

可変長マクロ引数の話

これはC++11 Advent Calendar 2011の4日目の記事です。 C++11ではプリプロセッサが可変長マクロ引数に対応しました。例を挙げましょう。 #define ROTATE(...) ROTATE_I(__VA_ARGS__) #define ROTATE_I(x, ...) __VA_ARGS__, x ROTATE(1, 2) // 2, 1 ROTATE(R…

プリプロセス時足し算・引き算・かけ算・剰余演算を定数時間で

http://ideone.com/eK4vc #include <boost/preprocessor/cat.hpp> #define PP_ADD_C(x, y) PP_NAT_TO_LIT(PP_NAT(x) PP_NAT(y)) #define PP_SUB_C(x, y) PP_COMPL(PP_ADD_C(PP_COMPL(x), y)) #define PP_MUL_C(x, y) PP_NAT_TO_LIT(PP_CST_REPEAT(x, PP_NAT(y))) #define PP_MOD_C(x, y) </boost/preprocessor/cat.hpp>…

前に作ったPP_IS_EMPTYの問題点

以前、PP_TUPLE_SIZEを作るために作ったPP_IS_EMPTYがどうなっていたのか思いだしたら、少しばかり問題がありました。 #define FOO(a, b, c) PP_IS_EMPTY(e FOO)eをカンマで区切られていないトークン列として、上記のようなトークン列を引数とすると、置換に…

tieで初期化させろ take 2

このような指令が来ましたので、やりましょう。 #include <utility> #include <tuple> #include <iostream>#include <boost/preprocessor/tuple/elem.hpp> #include <boost/preprocessor/tuple/eat.hpp> #include <boost/preprocessor/tuple/rem.hpp> #include <boost/preprocessor/seq/seq.hpp> #include <boost/preprocessor/seq/size.hpp> #inc…</boost/preprocessor/seq/size.hpp></boost/preprocessor/seq/seq.hpp></boost/preprocessor/tuple/rem.hpp></boost/preprocessor/tuple/eat.hpp></boost/preprocessor/tuple/elem.hpp></iostream></tuple></utility>

プリプロセッサ基礎文法最速マスター

最速だけに催促されたので書きますね! 1.基礎 印字命令を見てみましょう。 lesson1-1.cpp 123 abc AAAAAAAAAAAAAAAAA!と書いたファイルを実行すると、 123 abc AAAAAAAAAAAAAAAAA!このようになります。見てのとおり書いたまんま印字されるので、特に印字す…

オーバーロード自動生成ソース

追記:発表の資料にもあった例ですが、make_tupleだと別に非const参照をオーバーロードする必要はないので、型Tのコンストラクタの引数を受けとって、その引数から作ったTの値を保持するmy_smart_ptrを返す関数と変更しておきました。追記ここまで #include <boost/preprocessor/arithmetic/inc.hpp></boost/preprocessor/arithmetic/inc.hpp>…

タプルの要素数を数える

世間では空前のプリプロセッサブームですね! http://codepad.org/IwJ4sqA9 C++0xの規格を眺めていると、プリプロセッサのセクションに可変長引数リスト付きマクロが入っていたので、これを使って何か面白いことができないかと考えていたところ、タプルの要…

1から10まで足すんだって、プリプロセッサで

ネタ元:http://d.hatena.ne.jp/RiSK/20090930/1254307989 同じ方法でやっても面白くないので、なんか違うアプローチをとってみました。 #include <boost/preprocessor/repetition/repeat.hpp> #include <boost/preprocessor/repetition/repeat_from_to.hpp> #include <boost/preprocessor/seq/size.hpp>#define PAREN_I(z, n, d) BOOST_PP_REPEAT(n, PAREN_II, _) #…</boost/preprocessor/seq/size.hpp></boost/preprocessor/repetition/repeat_from_to.hpp></boost/preprocessor/repetition/repeat.hpp>

プリプロセッサでFizzBuzz

ネタ元:http://d.hatena.ne.jp/bleis-tift/20090929/1254185496 #include <boost/preprocessor/arithmetic/inc.hpp> #include <boost/preprocessor/arithmetic/mod.hpp> #include <boost/preprocessor/cat.hpp> #include <boost/preprocessor/control/expr_iif.hpp> #include <boost/preprocessor/control/iif.hpp> #include <…</boost/preprocessor/control/iif.hpp></boost/preprocessor/control/expr_iif.hpp></boost/preprocessor/cat.hpp></boost/preprocessor/arithmetic/mod.hpp></boost/preprocessor/arithmetic/inc.hpp>

プリプロセッサで再帰しましょう!

みなさまいかがお過ごしでしょうか?さて、今日のテーマは「再帰」です。プリプロセッサでは再帰が扱えないので、例えば、 #define PP_APPLY(f, x) f(x) #define HOGE(x) PP_APPLY(PIYO, x)という定義があったとして、 PP_APPLY(HOGE, FUGA)とか書いてあると…

tieで初期化させろ

#include <boost/preprocessor/tuple/elem.hpp> #include <boost/preprocessor/tuple/rem.hpp> #include <boost/preprocessor/seq/fold_left.hpp> #include <boost/preprocessor/arithmetic/inc.hpp>template<size_t N, typename T> typename std::tuple_element<N, T>::type & get_with_tuple_ref_collapsing(T & tup) { r…</n,></size_t></boost/preprocessor/arithmetic/inc.hpp></boost/preprocessor/seq/fold_left.hpp></boost/preprocessor/tuple/rem.hpp></boost/preprocessor/tuple/elem.hpp>

Boost.Lambdaでletとかwhereを書かせろ

#define LET(var) [&] { var IN #define IN(body) return body; }() #define LAMBDA(def) [&] { LAMBDA_WHERE(LAMBDA_WHERE_I def) return LAMBDA_BODY def )); }() #define LAMBDA_WHERE_I(body) LAMBDA_WHERE_II #define LAMBDA_WHERE_II(where) NIL where…

副産物

C++でDとかC#のデリゲートっぽい物体自動生成機を書こうとしたけど id:xyuyux さんが既に完成させはったということで、私は副産物でも。 http://codepad.org/ZECUiV5V (OPEN から END) まで、括弧がバランスなら何書いても引数に取って展開できるマクロの仕…

プリプロセッサで代入しましょう!

さて今回は代入です。とはいっても関数マクロを展開中に代入とかは無理です。なので、#defineで、プリプロセスシンボルに代入しましょう。 あともうかなりめんどいので超展開で話が進みます。 #define A 1 #define B A #undef A #define A 2 B 最後の行のBは…

プリプロセッサでループしましょう!

みなさんいかがお過ごしでしょうか?前回は足し算しました。今回はループです。 足し算ではとにかくいっぱいPP_ADD_Iを並べましたが、もっとスタイリッシュに書きたいですね。書きましょう。 まずC/C++のループはこんな感じです: while (condition) { ... }…

プリプロセッサで足し算しましょう!

プリプロセッサは所詮文字列置換、計算なんてできやしない…そう思っている方は多いでしょう。しかしそれは違います。計算できます。 本日の目的はプリプロセッサで足し算です。ADD(3, 2)と書けば5と答えてくれる関数マクロを作ってみましょう。 おっと、#def…