2007-09-01から1ヶ月間の記事一覧

型がPODかどうかチェックする方法

boost::is_podはほとんどのコンパイラで動かないようだ 以下のようにすると少なくとも警告が出せる (Comeauやgccなど) Boost.Xpressiveが利用していると思われる inline void pod_check(...) {} struct A {}; struct B : A {}; inline void pod_check_of_AB(…

adobe::poly

C++

これはadobeのtype erasureライブラリであるらしい…ドキュメント(されてないけど)と記事(pdf) いわゆるclone_ptrと違ってCopyConstructibleを要求するが、copyにheapを使わないような最適化が出来る 実装を試みた…実装 そのほか気になる記事(pdf) A Language…

右結合のpipe

関数呼び出しのシンタックスは醜い f(g(h(x)) を f $ g $ h $ x の様な感じに書けるようにしたい これはpipableを逆にしただけなので、何か右結合のoperator overloadをこの実装に追加すればいい Pipableの概念に組み込むのがいいかもしれない これを使ってO…

rangeをmapにする

"range expression"を型をキーにした連想配列にする (実装) iteratorにデータを持たせて、あとで取り出す 使い道はまだ不明

Unrolled Algorithms

保存していたBoost.Sequenceから拝借 (実装) 早くなったり遅くなったり、使いどころが難しい oven::unrolled_copy_c<7>(b, &a[0]);

any_output_iterator

OutputIteratorを何でも保持するany_output_iterator (実装) この実装が正しいのかどうか分からない any_iteratorと違うクラスにするのは正しいと思う std::vector<char> v; any_output_iterator<char &> oi(std::back_inserter(v)); std::string src("abcdefg"); std::cop</char></char>…

any_ref

参照を何でも保持するany_ref (実装) boost::tuple<int, char, std::string> tup(1, 'a', "hello"); BOOST_FOREACH (any_ref a, oven::hetero<any_ref>(tup)) { if (a.type() == typeid(std::string)) { std::string &s = pstade::any_ref_cast<std::string>(a); s = "goodbye"; break; } } BOOST_CHECK( bo</std::string></any_ref></int,>…

tupleをiterateする

使い道があるのか分かりませんが… 大胆な実装 同じ型に変換しないと使えない rectangle r; triangle t; circle c; boost::tuple<rectangle*, triangle*, circle*> tup(&r, &t, &c); BOOST_FOREACH (shape *s, oven::hetero<shape *>(tup)) { s->draw(); }</shape></rectangle*,>

関数の引数を名前付きにする

Boost.Parameterは使うのが恐ろしいので、それに近いことをするhigher-order関数 named (実装とサンプル) 名前無しと名前付きを混ぜられない Boost.Fusionが必要

Egg Functional Library 0.9

少し前にボツになったライブラリを復活させた 関数オブジェクトを静的に構築できるライブラリになりました ドキュメント すでにWorkaroundが4個もあるのが苦しい Quickbook1.4のimport文は強力

static initialization vs ODR violation

まず、ODR violation対策のこれを参照 msvcは、上の_1を(optimizerがないと?)statically-initializeできない gccは、_1はstatically-initializeできるが、placeholder const *p_1 = &_1; のように使った場合、p_1をstatically-initializeできない 結局、sta…

関数を退化させる

高階関数に関数を通すと、どうしても引数がtemplateになってしまう 引数を間違えるとインスタンス化の奥底でエラーが出て困る そこで、引数の型を指定する高階関数 mono (実装とサンプル) ちなみに、Boost.Lambda functorはrvalueを受け付けるようになってい…

関数をlazyにする

Boost.Phoenixには、bindしなくてもlambda式として使えるようにするフレームワークがある Boost.Lambdaのplaceholderでもそれを出来るようにする高階関数lazy (実装) 実装はboost::lambda::bindを呼んでいるだけ boost::lambda::bind自身をlazyにすると、複…