今さらながら、clampで遊んでみました
・clampとは?
C++でラムダ式を使えるようにするプリプロセッサ(そのままですね)
・特徴
boost::lambdaよりも可読性が高く、高性能
C#の匿名delegateによく似ている(そのまま?)
・ダウンロード先
http://assorted.sourceforge.net/clamp/
・ラムダ式を使わない場合
#include <iostream> #include <vector> #include <algorithm> using namespace std; void disp(int value) { cout << value << endl; } int main() { vector<int> v; v.push_back(3); v.push_back(1); v.push_back(4); for_each(v.begin(), v.end(), disp); return 0; }
短い処理でも関数を作らないといけない
・boost::lambda(ライブラリでラムダ式を実現)
#include <iostream> #include <vector> #include <algorithm> #include <boost/lambda/lambda.hpp> using namespace std; using namespace boost::lambda; int main() { vector<int> v; v.push_back(3); v.push_back(1); v.push_back(4); for_each(v.begin(), v.end(), cout << _1 << "\n"); return 0; }
とても簡潔に記述することができ、エレガントなコードになるのだが、
簡単なことしかできない(それでも十分すぎる)
・C++0x次期標準予定ラムダ式(言語の機能として実現)...間違ってるかも
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> v; v.push_back(3); v.push_back(1); v.push_back(4); for_each(v.begin(), v.end(), <>(int value) -> { cout << value << endl; }); return 0; }
boost::lambdaより高性能にはなったが、こんなソース読めない
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> v; v.push_back(3); v.push_back(1); v.push_back(4); for_each(v.begin(), v.end(), lambda void (int value) { cout << value << endl; }); return 0; }
非常に簡潔で高性能
lambdaというキーワードを付けて、そのあとに通常の関数定義を書けばいい
・clampの使い方
ダウンロードしたclamp.exeに上記ソースファイル(sample.clamp)を通す
コマンドラインで以下を実行
「clamp sample.clamp -> sample.cpp」
これで以下の3つのファイルが出力される
・sample.cpp
・lambda_impl.clamp_h
・lambda_body_1.clamp_h
出力されたソースファイルは通常のC++構文に置き換えられているので
それをコンパイルして実行する
いや〜clampおもしろいですね。