前回、どこまで書いたっけかなw
・・・・・前回の解説じゃちょっと飛んでるところも多いね、こりゃ。
まず、用語説明から。
・TC
Closure クロージャー(
Closure)を実現するために あるけ が作ったテンプレートクラス
・
Lambda 無名関数を扱えるようにした
BOOST に入ってるトリッキーなテンプレートクラス
こんなもんかな。
他にはカリー化とかも知っておいた方がいいんだろうけど、あるけ 自体実は良くわかってないので省きますw
さて、前回は式のオブジェクト化を行えば
Closure が出来そうなこととか、
Lambda がどうやって動いてるのか?を簡単に説明しました。
Lambda 自体はすごく綺麗に動的に関数の生成を行えるように作られています。
しかし、実際問題として、
Lambda を有機的に使うことはすごく難しいです。
なぜなら、この前の説明で作った ((_1 * 100 + _2 + 10)(1,2)) の左辺値を変数に格納しようとしたら、
boost::lambda::lambda_functor_base
::sig::type boost::lambda::lambda_functor::operator ()(A &,B &) const'
with
Act=boost::lambda::arithmetic_action,
Args=boost::tuples::tuple arithmetic_action,boost::tuples::tuple lambda_functor,
boost::tuples::tuple>,
const boost::lambda::detail::parameter_traits_ IF::RET>::type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::
null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,
boost::tuples::null_type>>>,boost::lambda::lambda_functor>,boost::tuples::null_type,
boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,
boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>>,const boost::lambda::detail::
parameter_traits_::RET>::type,boost::
tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::
null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
SigArgs=boost::tuples::tuple null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,
boost::tuples::null_type>,
T=boost::lambda::lambda_functor_base,boost::
tuples::tuple lambda_functor,
boost::tuples::tuple arithmetic_action,boost::tuples::tuple lambda::placeholder<1>>,const boost::lambda::detail::parameter_traits_ IF::RET>::type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::
null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,
boost::tuples::null_type>>>,boost::lambda::lambda_functor>,boost::tuples::null_type,
boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::
tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>>,const boost::lambda::detail::
parameter_traits_::RET>::type,boost::
tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::
null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>,
A=int,
B=int
まぁ、こんな冗談みたいな長さのテンプレートを宣言しないと格納できないわけです(;´Д`)'`ァ'`ァ
これが Lambda を使用する場合のもっともとっつきにくい部分でしょう。
使える場面が少ないのと、使う場合は必ずテンプレート関数にしないといけないからです。
暗黙のテンプレート引数として使えば、別にどんな型だろうが使う側は知らなくてもOKですからね。
次は、Lambda がどうやって動いてるのかを説明しようと思います。
今日は忙しいのでさわりの部分だけw

コメント
コメントの投稿