Boost

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

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

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>…

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

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

Boost.Phoenix で range-based for

phx::for_each より楽に使えるものをと. https://gist.github.com/1540409 void revival_example() { using boost::phoenix::arg_names::_1; using boost::phoenix::arg_names::_2; using boost::phoenix::local_names::_x; int array[5] = { 1, 2, 3, 4, 5…

Egg の楽しみ

これは Boost Advent Calendar 2011 の参加記事 (11 日目)です. 今日はせっかくの機会なので,個人的に関心の高い Egg について,ちょっと書いてみたいと思います.Egg を知らない人も多いと思いますので,ここでは入門・解説を書くのではなく,どのような…

random_shuffled range アダプタ

久しぶりに range アダプタでも. 考え方は oven::sorted と同じで,range からイテレータのリストを作り,そのリストをシャッフルします.結果として forward range にも対応できます. random_shuffled.hpp (要 P-Stade) #ifndef IORATE_RANDOM_SHUFFLED_H…

C++ で FibBuzz

震源地: Codnote.net やりましょう. fibbuzz.cpp #if !defined(BOOST_PP_IS_ITERATING) #include <boost/preprocessor/iteration/iterate.hpp> #include <boost/preprocessor/slot/slot.hpp> #define BOOST_PP_VALUE 1 #include BOOST_PP_ASSIGN_SLOT(1) #define BOOST_PP_VALUE 1 #include BOOST_PP_ASSIGN_SLOT(2) #define BOOST_P…</boost/preprocessor/slot/slot.hpp></boost/preprocessor/iteration/iterate.hpp>

C++ で 2 進数を書く

BOOST_BINARY を使う やっぱり基本はマクロですね.ある車輪は使いましょう. #include <boost/utility/binary.hpp> #include <boost/static_assert.hpp> BOOST_STATIC_ASSERT((BOOST_BINARY(1001 1100 1011 111) == 0x4E5F)); テンプレートを使う C++ と言えばテンプレートメタプログラミング.あまり大きな数を</boost/static_assert.hpp></boost/utility/binary.hpp>…

固定長多次元配列のラッパ

std::array<std::array<T, M>, N> も std::vector<std::array<T, M> > も, &a[i][j] == &a[0][0] + i * M + j が成立するという意味での連続性が保証されるか分かったもんじゃないですねかわいい2011-09-12 10:24:33 via webstd::array, M> に要素の連続性の保証がないなら*1,生の多次元配列(</std::array<t,></std::array<t,>…

Phoenix で variant を返す条件演算子

Boost.Phoenix の if で戻り値を返す - C++でゲームプログラミング Phoenix の if_else は then 節と else 節の common_type を返しますが,それらの型が異なる場合は variant に収めて返すという戦略もあるでしょう.Phoenix ではそのような条件演算子もユ…

MPL でカリー化

curryN<F> で,N-ary なメタ関数クラス F をカリー化します. #ifndef CURRY_HPP #define CURRY_HPP #include <boost/mpl/bind.hpp> #include <boost/mpl/placeholders.hpp> #include <boost/mpl/protect.hpp> #include <boost/preprocessor/arithmetic/dec.hpp> #include <boost/preprocessor/cat.hpp> #include </boost/preprocessor/cat.hpp></boost/preprocessor/arithmetic/dec.hpp></boost/mpl/protect.hpp></boost/mpl/placeholders.hpp></boost/mpl/bind.hpp></f>

そろそろ result_of について

result_of とは 呼び出し可能な型と引数の型から,呼び出した場合の戻り値の型を導出するメタ関数です.例を示しましょう. typedef int (*char_to_int)(char); int digit_to_int(char c) { return c - '0'; } // char_to_int 型に,char 型の引数を渡した時…

boost::array 型のメンバ変数を初期化子リストで初期化する

追記: 名前を変更 (elements → braced2).boost::array に限らず { { args... } } で初期化できるものなら大体使えます.また少し変更すれば { args... } などで初期化することもできます. C++03 では,配列型のメンバ変数を初期化子リストで初期化すること…

C++ で一般化された on を書く

Data.Function on :: (b -> b -> c) -> (a -> b) -> a -> a -> c on f g = \x y -> f (g x) (g y) これの引数の数と型を一般化したものを,C++ を使っていくつかの方法で書いてみました.Variadic な関数オブジェクトを書く上で参考になるかもしれません. …

std::tuple の Fusion アダプト

Sandbox にありました。Fusion を C++0x に移植する試みのようです (参照)。 https://svn.boost.org/svn/boost/sandbox/SOC/2009/fusion/自分でも書いてみました。GCC 4.5, GCC 4.6, VC10 に対応しています。 ヘッダ https://gist.github.com/996989 テスト …

Boost.Move 解説 (後編)

前回の続きです。今回は、Boost.Move による引数の転送を中心に解説していきたいと思います。 前回の補足 Boost.Move を使う利点 重要なことに触れていませんでした。 Move semantics は、乱暴に言えば「死すべきオブジェクト (rvalue) からは破壊的コピーを…

Boost.Move 解説 (前編)

はじめに Boost.Move は、C++0x で導入される move sematics を C++03 でエミュレートするべく、Ion Gaztanaga 氏 (Boost.Interprocess の作者) によって開発されたライブラリです。既に Boost 入りが決定しており、現在 trunk にあります。 この記事は、そ…

Boost.Move に対応した array

※ Boost.Move の入っている revision について書きます Boost.Interprocess には Boost.Move に対応したコンテナが付属していますが、その中に std::array に相当するものはありません。これは、move constructor などを追加することにより、array が aggreg…

関数適用演算子

Haskell には関数適用演算子 $ があり、しばしば括弧を省く目的で用いられます。C++ でもやってみましょう。 #include <utility> namespace apply { template <class F, class A> inline auto operator|=(F &&f, A &&a) -> decltype(std::forward<F>(f)(std::forward<A>(a))) { return std::fo</a></f></class></utility>…

C++03 で使える reference_wrapper

導入 C++0x の std::reference_wrapper は operator() を参照先に forward するので、関数オブジェクトを要求する関数 (STL アルゴリズムなど) にそのまま渡すことができます。 しかし、boost でこれに相当すると思われる boost::reference_wrapper にはこの…

C API の range ラッパー

以前少し考えたことがあったのですが、最近同じ話題を見かけたのでまとめてみました。 Range の要素がメモリの連続領域にあること (すなわち、&*(begin(r)+n)==&*begin(r)+n が常に成り立つこと) が保証されていれば、その range のデータをレガシーな C API…

Deleter を取る scoped_ptr

クラステンプレートの引数で deleter を取るものであれば、boost::interprocess::scoped_ptr があります。今回は、コンストラクタテンプレートの引数で deleter を取るものを C++0x で書いてみました。 GCC 4.6 で入った新機能 noexcept, nullptr も使ってい…

ネストされた range の入出力

実用には耐えませんが、ちょっとしたデバッグなどに。 入力をオウム返しする例 #include <deque> #include <iostream> #include <list> #include <vector> #include "./printed.hpp" #include "./scanned.hpp" int main() { std::deque<std::list<std::vector<int>>> rng; std::cin >> (rng | vitro::scanned); // >>> {</std::list<std::vector<int></vector></list></iostream></deque>…

split adaptor

リストの分割は 検索:デリミタを探す 分割:トークンのリストを作る(空のトークンを除去する、デリミタを残すなど) という2つの独立した操作に分解できると思ったので、2つの操作をポリシーでカスタマイズできるようなsplit iteratorを作り、それをベースに…

Boost.PPでクイックソート(改良版)

まず素直に再帰で実装したものがこちら。 http://ideone.com/3Sz2P 美しくありませんね。 マクロは再帰できないため、ループや再帰を実現するにはどこかでこのような連番マクロを使う必要があります。しかし、そういった汚れ仕事はBoost.PPのWHILEやSEQ_FOLD…

Boost.PPでエラトステネスの篩

プリプロセッサをやればかわいい妹ができると聞いて。 #include <boost/preprocessor/arithmetic/inc.hpp> #include <boost/preprocessor/arithmetic/mod.hpp> #include <boost/preprocessor/comparison/not_equal.hpp> #include <boost/preprocessor/repetition/for.hpp> #include <boost/preprocessor/seq/enum.hpp> #include </boost/preprocessor/seq/enum.hpp></boost/preprocessor/repetition/for.hpp></boost/preprocessor/comparison/not_equal.hpp></boost/preprocessor/arithmetic/mod.hpp></boost/preprocessor/arithmetic/inc.hpp>

多相ファンクタのはなし

関数テンプレートは型がないというお話がありました。値もありません。 template <class T> T square(T x) { return x * x; } int main() { int array[] = {0, 1, 2, 3}; std::vector<int> v; // エラー!squareを引数として使用できない std::transform(array, array + 4, </int></class>…

Rangeの直積を作るadaptor

直積を作るadaptorがない気がしたので書いてみました。 つかいかた #include <iostream> #include <string> #include <boost/lambda/lambda.hpp> #include <boost/range/algorithm/for_each.hpp> #include <boost/range/irange.hpp> #include <boost/tuple/tuple_io.hpp> #include "product.hpp" int main() { // (1 a) (1 b) (1 c) (2 a) (2 b) (2 c) …</boost/tuple/tuple_io.hpp></boost/range/irange.hpp></boost/range/algorithm/for_each.hpp></boost/lambda/lambda.hpp></string></iostream>