Boost.Parameterは使うのが恐ろしいので、それに近いことをするhigher-order関数 named (実装とサンプル) 名前無しと名前付きを混ぜられない Boost.Fusionが必要
少し前にボツになったライブラリを復活させた 関数オブジェクトを静的に構築できるライブラリになりました ドキュメント すでにWorkaroundが4個もあるのが苦しい Quickbook1.4のimport文は強力
まず、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を受け付けるようになってい…
Boost.Phoenixには、bindしなくてもlambda式として使えるようにするフレームワークがある Boost.Lambdaのplaceholderでもそれを出来るようにする高階関数lazy (実装) 実装はboost::lambda::bindを呼んでいるだけ boost::lambda::bind自身をlazyにすると、複…
2年かかってしまった (参照) 実装とサンプル これを参考にしてfixから実装した (fixの実装とサンプル) curry化は素朴に実装できて、コンパイル時の負担も少ない(ように感じる)
新しいプログラミングパラダイム、かもしれない オブジェクトを静的に作るために全部POD型にする Boost.XpressiveやBoost.Protoがその実践例と考えられる 実際的なメリットとしては、コンパイルが早くなる 初期化に関数を使わないから POD型はユーザー定義の…
static-initializationのために苦しいマクロを使う羽目になる 8.5.1/14(Working Draft)はsubaggregateにも当てはまると思われるので型が複雑になると大変になる 実装とサンプル Quickbook1.4(Boost1.35相当)がかなりパワーアップしていた
よく考えると、"子Range"は"親Range"の要素にアクセスできなければいけない 結局、Rangeを返す関数オブジェクトを渡す、という苦しいことになった (実装) ちなみに実装は、本当にモナドから作った 複雑なiteratorがいろいろ必要なので、STLが最後にたどりつ…
FC++にあって、実装は意外に簡単 実装とサンプル Haskellのマネであるらしい
List Comprehensionのエミュレートを試みた これがRangeに関する一番ややこしい課題なのではないかと思う 怪しい実装とサンプル FC++も参照
前回のは少しおかしかったので訂正 parallel_xxxはこの辺りに (サンプル) parallel_for(for_eachじゃない)の必要性が良く分からなかった
[id:tueda_wolf:20070725]を参照 parallelなアルゴリズムの実装を試みた (怪しいparallel_sort) TBBは分割した後sortしているようだ
これはボツにしてovenに組み込むことにした 用語はC#から拝借した in_blockについてはもっと良い名前が思いつかなかった オリジナルのiteratorのコード これを使ってyield流のunfoldr
[id:siokoshou:20070723]にインスパイアされて 実装とサンプル これでiterate_iterator(ややこしい)とgenerator_iteratorが必要なくなった unfoldr_iteratorも作ったが、それでは抽象度が足りないようだ anamorphismなるものについて
EBOが働かない場合があるらしい (参照) もう自分でprivate部を書く方が簡単だと思う
auto_ptrはelement_typeが異なるものからはcopy-initializeできないようだ (参照) auto_ptrの初期化の表 Defect Report 84. user-defined conversionが二回必要なので駄目らしい [id:mb2sync:20060808]もコンパイルエラーになるべきだと思われる
pop_backをrange adaptorで表現する 定数時間で返すために"rangeをendの手前まで走査する"ということは出来ないことに注意 TraversalCategoryに応じて異なるiterator adaptorが必要になる SinglePassの場合 Forwardの場合 これをRangeなしで使いやすいインタ…
おまけのサンプル (全体のコード) 5個並べるのもしばらく待たなければならないほど遅い []typedef[] []any_range[][]<[][]int[][]&, [][]boost[][]::[][]forward_traversal_tag[][]>[] []range[][];[][]range[] []quick_sort[][]([][]range[] []rng[][])[] […
だいたい完成(に近づいた)かもしれない (ドキュメント) 結局二年くらいかかってしまった これでFizzBuzz in C++ ([id:takatoh:20070509:fizzbuzz]を参照) boost::zip_iteratorは*itが参照型でないForwardTraversalIteratorをzipできない これは仕様なのかバ…
boost::optionalをresetしてからassignすればいいだけだった (実装)
名前がついてました (参照)
昨日の続き 要するに、nativeなtypeofが無い時だけtype erasureする 結局こうなった (実装とサンプル) これを使ってITER_FOREACHを作ってみる (実装とサンプル)
ネストされたiterator型に使えないらしい つまり役に立たない が、any_rangeにすれば大丈夫なので、ポータブルなマクロが作れる (実装) []PSTADE_OVEN_AUTO[][]([][]factorials[][],[] []counting_from[][]([][]1[][])|[][]scanned[][]([][]1[][], [][]regul…
static_castは何をしているか分からないので駄目である そこで実行時にチェックできる場合はチェックするdowncast (実装) VC++7.1のバグのおかげですごく苦労した cv-qualifierは自動なのがミソ []#include[] []<pstade/static_downcast.hpp>[] []#include[] []<boost/utility/result_of.hpp>[]</boost/utility/result_of.hpp></pstade/static_downcast.hpp>
boost::arrayをdirect-initializationする方法がないらしい (参照) make_arrayのようなものを作らないといけない Boost.Assignはassignするので少し遅くなる そこでinitializer-list(pdf)のようなもののエミュレートを試みた 実装とサンプル copy_range関数…
VC++7.1 SP1で直ったと思っていたら(デバグモードで)出た .cppにあるのはWinMain1個だった、なんてことがあるのでお手上げになってしまう /ZIを/Ziに変えるのが決め手らしい (参照)
1.34のコードはかなり変更されていて「小さなオブジェクト」の場合は、コピーにheapを使わなくなっている Boost.Lambdaなんかを代入しても速い 以前はboost::is_statelessかどうかで判定していたようだ 大きなオブジェクトの場合も、それがstatelessであるこ…
Thomas Beckerによるany_iteratorがかなり本格的なものに書き直されている Boostに入る? any_iterator_abstract_base.hppが面白い
spirit::multi_passをちゃんと書き直したつもりの実装 メモ化は効果が強烈である(何十倍も速くなったりする)