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

VC++10 CTPでラムダ式を遊んでみた

VC++

【参照環境を持つラムダ式はスコープが外れたらその実行は未定義】

まずはコピーラムダを返してみる

#include <iostream>
#include <functional>

using namespace std;

std::tr1::function<int(int)> foo()
{
    int n = 3;
    return [n](int i) -> int { return n + i; };
}

int main()
{
    cout << foo()(2) << endl; // 5
}


参照ラムダを返してみる(reference_closureがないのでfunctionで返す)

#include <iostream>
#include <functional>

using namespace std;

std::tr1::function<int(int)> foo()
{
    int n = 3;
    return [&n](int i) -> int { return n + i; };
}

int main()
{
    cout << foo()(2) << endl; // -858993458
}

おーけーおーけー



ラムダ式vectorに入れてみる】

#include <vector>
#include <functional>

using namespace std;
using namespace std::tr1;

int main()
{
    vector<function<void()>> v;

    v.push_back([]{});
    v.push_back([]{});
} // ここで落ちる

バグだー。



ラムダ式からメンバ関数を呼び出してみる】

メンバ関数内のラムダ式はそのクラスの friend と見なされるので private メンバを呼ぶことができます。
それと、メンバ関数を呼ぶには this をキャプチャします。

#include <iostream>

using namespace std;

class hoge {
    void private_member() const
    {
        cout << "call private" << endl;
    }
public:
    void call() const
    {
        [this]{ private_member(); }();
    }
};

int main()
{
    hoge().call(); // call private
}
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
using namespace std::tr1;

class hoge {
    vector<int> vec_;

    void disp(int i) const
    {
        cout << i << endl;
    }

public:
    hoge()
    {
        vec_.push_back(3);
        vec_.push_back(1);
        vec_.push_back(4);
    }

    void call() const
    {
        for_each(vec_.begin(), vec_.end(), [this](int i){ disp(i); });
    }
};

int main()
{
    hoge().call();
}

メンバ関数呼ぶのがだいぶラクになったなー。



STL/CLRラムダ式

#include <cliext/vector>
#include <cliext/algorithm>

using namespace cliext;

int main()
{
    vector<int> v;

    v.push_back(3);
    v.push_back(1);
    v.push_back(4);

    for_each(v.begin(), v.end(), [](int x){ System::Console::WriteLine(x); });
}
3
1
4

ふつーに動いた




ラムダ式はもう慣れた。