@egtraイグトランスの頭の中(のかけら)ActiveBasicを中心にプログラミングの話をぼちぼちと。~C++はラムダ式もfunction型(JavaのFunction型に大体対応?)も、2011年の規格改定(通称C++11)から使えたので、似たようなことはすでにできます。上記の記事のパクリなので、上記の記事をまずは読んでから読むことをおすすめします。Function型C++11で標準に入ったfunction型をみてみましょう。名前空間まで含めるとstd::funcitonです。こんな感じで使います。};テンプレートで関数を表す型によって引数・戻り値を記述します。(string)という型の構文は関数を表す型であり、おおむね関数プロトタイプから関数名を取り除いた感じです。呼び出し型は普通の関数と同じです。endl;こうすると、次のような表示になります。[foo]もうひとつ関数を定義してみましょう。最初の文字を大文字にする関数です。};0文字の文字列を与えると死にますが、コード例ってことで大目にみてください。to_lower_copyはBoost.StringAlgoライブラリの関数です。標準ライブラリのtoupper/tolower関数は、文字型(1文字)にしか使用できないので、仕方なく使用しています。endl;こんな感じの表示になります。Fooこの2つを順に呼び出して、capitalizeしてencloseしようとすると、こんな感じになりますね。endl;表示はこうなります。[Foo]こういう場合、std::bindを使うと連結できます。endl;これは、関数合成として使えます。endl;andThen相当としてstd::bindを持ち出すのが適切なのか若干疑問ですが、C++11で関数型っぽいことができることがわかりました。やりましたね!別名を使う?さて、Functionって長いので、Fとか短く書きたいですね。いう場合はCならtypedefでしたが、C++11ではusingを使います。今回のようにテンプレートが関係する場合、usingしか使えません。function<T>;余談ですが、typedefの代わりとしてusingを使えば、typedefの意味不明な構文とおさらばできてありがたいです。C#のvarのようなautoがあるので、こちらが便利です。_1));なお、ラムダ式の型もstd::bindが返す型も実はstd::functionではありません。std::functionは関数呼び出しできるものなら何でも格納できるポリモーフィックな型です。そのため、通常はautoで受け取るほうが実行効率が良いです。関数合成C#版同様、省略します。encloseのように|演算子で繋げる形にするのがC++っぽいような感じがします。カリー化std::function引数は引数が何個でも対応しているので、素直にそれに甘えたら良いのです。それでは話が進まないので、元の例に対応するようにカリー化した形式を書いてみましょう。};[]の中に出てきた=は、外側の変数を内側で使用する指示になります。呼び出しは次のようになります。endl;表示は次のようになります。***sanded!***3引数版は省略します。いう使い方をする必要はないでしょうから。19:00頃追加:やりました。endl;何より、部分適用したいだけならstd::bindを素直に使えばいいと思います。bindは任意の引数について部分適用する機能もあります。endl;まとめここまでのコードをまとめて載せます。4.2)で動くことを確認しました。C++だとダメでした。C#と違い、auto(C#のvar相当)がラムダ式にも使えるのは良いです。その一方、ラムダ式の文法がC#やJavaより冗長なのが残念です。ラムダ式の[]が気持ち悪いという声はよく聞きますが、「ないよりマシ」と自身に言い聞かせましょう。しているうち、私は気にならなくなりました。}2013年5月5日19:00頃追記:カリー化の箇所を追加しました。19:09確かに、このままでいるのも中途半端だと思い、カリー化の話の部分を追加しました。コメントをキャンセルメールアドレスが公開されることはありません。WPThemes.Info。