2012-01-01から1年間の記事一覧

タグ付きバリアント型(代数的データ型)

タグ付きタプル型 - yohhoyの日記 タグ付きバリアント型があってもいいじゃない。 Boost.Variant では要素の型で要素にアクセスしますが、代わりにタグ経由でアクセスすることで、 要素の意味が明確になる。 複数の同じ型の要素に別の意味を与えることができ…

HaskellのIntegerをC++で使う

C++の標準には多倍長整数ライブラリがありません。これは大変なことだと思います。 まあBoost.Multiprecision来るじゃないというのはさておき、 標準の多倍長整数がないなら他言語の標準から持ってくればいいということで、HaskellのIntegerをラップしてC++…

C++/Boost 小ネタ

コードだけ貼って全く説明しないのもアレかと思うので、汎用性のある手法をいくつか抜き出してみました。 boost::thread_specific_ptr Boost 版 TLS (Thread Local Storage)。thread_local がサポートされていない、でも __declspec(thread) や __thread は…

Boost.Context による単純なファイバー

いわゆる非対称コルーチン。C++03/11 両対応。 https://gist.github.com/3684731 簡単な使い方。 #include <iorate/fiber.hpp> int main() { iorate::fiber f([] { for (auto const c : "Hello, world!\n") { std::cout << c; iorate::fiber::yield(); } }); while (f.alive())</iorate/fiber.hpp>…

可変長引数を扱う手段として Fusion を使う

Variadic Template による可変長引数 ...args は f(args)... で f(a1), ..., f(aN) に展開できますが template <class ...Args> void fg(Args ...args) { f(g(args)...); // f(g(a1), ..., g(aN)) } 少し込み入ったことをする場合は、引数を Boost.Fusion の列にまとめてか</class>…

Iteratee で progress_display を書いてみた

Iteratee を始めようと思いこちらを読んでいたのですが, Lazy I/O must go! - Iteratee: 列挙ベースのI/O - 純粋関数型雑記帳 気になるフレーズが. streamToFile "hoge" `enumPair` throbber とすることにより、ファイル書き込みに簡単に進捗表示をつける…

Boost.Context でジェネレータを作る

知らないうちに Boost.Context が trunk 入りしていたので,それを使って Python のジェネレータのようなものを作る CRTP クラスを書いてみました. generator.hpp メンバ関数 generate を実装するとジェネレータを作り上げてくれます.ジェネレータは,遅延…

ラムダ式でムーブキャプチャ

C++

ラムダ式での変数のキャプチャはコピーまたは参照で行いますが,ムーブするための標準的な方法はありません. std::unique_ptr<int> p(new int(23)); auto f = [std::move(p)] { std::cout << *p << '\n'; }; // こんな書き方はない どうしても変数 p をムーブし</int>…