Boost.ResultOf

右結合のpipe

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

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

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

関数を退化させる

高階関数に関数を通すと、どうしても引数が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化は素朴に実装できて、コンパイル時の負担も少ない(ように感じる)

Deferred Callable Object

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

detail::functionN

Boost.Accumulatorsに、もうdetail::functionNが含まれていた これは、Forwarding Problemを解決するためのクラステンプレートである boost::result_ofのサポートも勝手にやってくれる これを使ったのモダンな実装がにある []#include[] []<boost/detail/function2.hpp>[] []#include[] []<boost/type_traits/is_same.hpp></boost/type_traits/is_same.hpp></boost/detail/function2.hpp>…

関数を定義する方法2006

ようやく関数の定義の仕方が分かってきたのでまとめておこう Iterator AdaptorのためにFunctionObjectはできるだけDefaultConstructibleかつAssignableにしておいた方がいい この不具合の回避策がかなり正確に分かった 基底クラスを持つか、あるいはユーザ定…

result_ofの使い方

関数オブジェクトfooと、その型op::foo(cv-qualifierなし)があるとする result_ofにはop::fooを渡すことになる (op::fooの参照型を渡してはいけないと思われる 20.5.4/1) 厳密には、result_ofだと思うのだが、constは付けないらしい (参照) 関数テンプレート…

(Im)perfect Forwarding

引数は5個まで (実装) 試しに10個にするとコンパイル時間が大変なことになった これもただの実験コードというわけではなく、 Boost.Lambda functorを一時オブジェクトを実引数に取れるように変換できる lambda::ret<>に相当する機能を付けられる 関数オブジ…

object generator

make_pairなどのコードは大体似通っている 自動化してしまえ (実装) 結局マクロになってしまった []#include[] []<utility>[] []#include[] []<pstade/object_generator.hpp>[] []#include[] []<boost/tuple/tuple.hpp>[]</boost/tuple/tuple.hpp></pstade/object_generator.hpp></utility>

callable

オリジナルのcallableにresult_ofのサポートをつけると、偶然にも?そのままこの回避策になってちゃんとVCでも動く! 実装とサンプル これで関数との戦いは終わった

untupled関数

tupleを取る関数を普通の関数に変換する (実装)と(サンプル) これはただ面白いというだけではなく、「まずTupleを引数にとる関数を実装しておいて、それをuntupledに変換してユーザに提供する」という方法でプリプロセッサを使わなくてよくなる はずなのだが…

関数をpipeにする

関数呼び出しのシンタックスは醜い Range Library Proposalではoperator|を使った回避策が提案されている これはRangeに限った話ではないので、result_ofを使って書こう (実装) []#include[] []<boost/utility/result_of.hpp>[] []#include[] []<pstade/pipable.hpp>[]</pstade/pipable.hpp></boost/utility/result_of.hpp>

tupled関数

関数をboost::tupleを取る関数に変更しよう (実装) HaskellでいうzipWithをするRangeに必要になった ([id:Cryolite:20061124]を参照) tie(xs, ys)|zipped|transformed(tupled(f)) を短く書ける Haskellでは map (uncurry f) (zip xs ys) になるようだ C++にc…

関数を作る

result_ofはやっぱりVC++ではうまく動かない (参照) たしか配列が絡むとさらによく分からないエラーになったと思う result_ofを直接Specializationすると動くのでそれを助けるライブラリ id:CryoliteさんのこれのおかげでBoost.Lambdaをサポートできた resul…

result_of

result_ofについて・・・参照 result_ofの利用者は大胆に型を訊ねて良い 実際にどのように引数を受け取るかは関数オブジェクトの実装者の自由 result_of::typeは常に成功し、デフォルト値(void)を持っている・・・参照 引数のない(つまりテンプレートでない)…