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

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にすると、複…

関数をメモ化する

2年かかってしまった (参照) 実装とサンプル これを参考にしてfixから実装した (fixの実装とサンプル) curry化は素朴に実装できて、コンパイル時の負担も少ない(ように感じる)

POD指向プログラミング?

新しいプログラミングパラダイム、かもしれない オブジェクトを静的に作るために全部POD型にする Boost.XpressiveやBoost.Protoがその実践例と考えられる 実際的なメリットとしては、コンパイルが早くなる 初期化に関数を使わないから POD型はユーザー定義の…

Currying in C++

static-initializationのために苦しいマクロを使う羽目になる 8.5.1/14(Working Draft)はsubaggregateにも当てはまると思われるので型が複雑になると大変になる 実装とサンプル Quickbook1.4(Boost1.35相当)がかなりパワーアップしていた

List Comprehensions in C++ その2

よく考えると、"子Range"は"親Range"の要素にアクセスできなければいけない 結局、Rangeを返す関数オブジェクトを渡す、という苦しいことになった (実装) ちなみに実装は、本当にモナドから作った 複雑なiteratorがいろいろ必要なので、STLが最後にたどりつ…

二項関数をinfixにする

FC++にあって、実装は意外に簡単 実装とサンプル Haskellのマネであるらしい

List Comprehensions in C++

List Comprehensionのエミュレートを試みた これがRangeに関する一番ややこしい課題なのではないかと思う 怪しい実装とサンプル FC++も参照

Parallel Algorithms

前回のは少しおかしかったので訂正 parallel_xxxはこの辺りに (サンプル) parallel_for(for_eachじゃない)の必要性が良く分からなかった

Parallel Iteration

[id:tueda_wolf:20070725]を参照 parallelなアルゴリズムの実装を試みた (怪しいparallel_sort) TBBは分割した後sortしているようだ

Iterator blocks in C++

これはボツにしてovenに組み込むことにした 用語はC#から拝借した in_blockについてはもっと良い名前が思いつかなかった オリジナルのiteratorのコード これを使ってyield流のunfoldr

unfold_iterator

[id:siokoshou:20070723]にインスパイアされて 実装とサンプル これでiterate_iterator(ややこしい)とgenerator_iteratorが必要なくなった unfoldr_iteratorも作ったが、それでは抽象度が足りないようだ anamorphismなるものについて

noncopyableは駄目かもしれない

EBOが働かない場合があるらしい (参照) もう自分でprivate部を書く方が簡単だと思う

auto_ptrの仕様

auto_ptrはelement_typeが異なるものからはcopy-initializeできないようだ (参照) auto_ptrの初期化の表 Defect Report 84. user-defined conversionが二回必要なので駄目らしい [id:mb2sync:20060808]もコンパイルエラーになるべきだと思われる

pop_iterator

pop_backをrange adaptorで表現する 定数時間で返すために"rangeをendの手前まで走査する"ということは出来ないことに注意 TraversalCategoryに応じて異なるiterator adaptorが必要になる SinglePassの場合 Forwardの場合 これをRangeなしで使いやすいインタ…

クイックソート in C++

おまけのサンプル (全体のコード) 5個並べるのもしばらく待たなければならないほど遅い []typedef[] []any_range[][]<[][]int[][]&, [][]boost[][]::[][]forward_traversal_tag[][]>[] []range[][];[][]range[] []quick_sort[][]([][]range[] []rng[][])[] […

Oven Range Library

だいたい完成(に近づいた)かもしれない (ドキュメント) 結局二年くらいかかってしまった これでFizzBuzz in C++ ([id:takatoh:20070509:fizzbuzz]を参照) boost::zip_iteratorは*itが参照型でないForwardTraversalIteratorをzipできない これは仕様なのかバ…

型をAssignableにする方法

boost::optionalをresetしてからassignすればいいだけだった (実装)

Deferred Callable Object

名前がついてました (参照)

Boost.TypeofとRange++

昨日の続き 要するに、nativeなtypeofが無い時だけtype erasureする 結局こうなった (実装とサンプル) これを使ってITER_FOREACHを作ってみる (実装とサンプル)

Boost.TypeofとRange

ネストされたiterator型に使えないらしい つまり役に立たない が、any_rangeにすれば大丈夫なので、ポータブルなマクロが作れる (実装) []PSTADE_OVEN_AUTO[][]([][]factorials[][],[] []counting_from[][]([][]1[][])|[][]scanned[][]([][]1[][], [][]regul…

static_downcast

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>

make_array

boost::arrayをdirect-initializationする方法がないらしい (参照) make_arrayのようなものを作らないといけない Boost.Assignはassignするので少し遅くなる そこでinitializer-list(pdf)のようなもののエミュレートを試みた 実装とサンプル copy_range関数…

error C1055の回避策

C++

VC++7.1 SP1で直ったと思っていたら(デバグモードで)出た .cppにあるのはWinMain1個だった、なんてことがあるのでお手上げになってしまう /ZIを/Ziに変えるのが決め手らしい (参照)

Small Object Optimization

1.34のコードはかなり変更されていて「小さなオブジェクト」の場合は、コピーにheapを使わなくなっている Boost.Lambdaなんかを代入しても速い 以前はboost::is_statelessかどうかで判定していたようだ 大きなオブジェクトの場合も、それがstatelessであるこ…

any_iterator更新

Thomas Beckerによるany_iteratorがかなり本格的なものに書き直されている Boostに入る? any_iterator_abstract_base.hppが面白い

memoize_iterator

spirit::multi_passをちゃんと書き直したつもりの実装 メモ化は効果が強烈である(何十倍も速くなったりする)