読者です 読者をやめる 読者になる 読者になる

clamp : C++ lambda preprocessor

C++

今さらながら、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より高性能にはなったが、こんなソース読めない


clamp(プリプロセッサラムダ式を実現)

#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おもしろいですね。