プログラミング楽しい




おひさしぶりです。
今回はstd::bindを使ってネストしたクラスのメンバ変数を束縛してみます。
以下サンプル

#include <iostream>
#include <vector>
#include <functional> // std::bind std::placeholders::_1
#include <algorithm>  // std::for_each

struct Hoge
{
    Hoge() : i(1) {}
    int i;
};

struct Hogehoge
{
    Hogehoge() : hoge(), i(2) {}
    Hoge hoge;
    int i;
};

struct Hogehogehoge
{
    Hogehogehoge() : hogehoge(), i(3) {}
    Hogehoge hogehoge;
    int i;
};

int main()
{
    using std::bind;
    using std::placeholders::_1;
    std::vector<std::function<int(const Hogehogehoge&)>> get_all_member;
    get_all_member.push_back(bind(&Hogehogehoge::i, _1));
    get_all_member.push_back(bind(&Hogehoge::i, bind(&Hogehogehoge::hogehoge, _1)));
    get_all_member.push_back(bind(&Hoge::i, bind(&Hogehoge::hoge, bind(&Hogehogehoge::hogehoge, _1))));

    Hogehogehoge h;
    std::for_each(get_all_member.begin(), get_all_member.end(),
    [&h](const std::function<int(const Hogehogehoge&)>& get_member)
    {
        std::cout << get_member(h) << std::endl;
    });
}

get_memberは一回目のループで、h.iを返し
get_memberは二回目のループで、h.hogehoge.iを返し
get_memberは三回目のループで、h.hogehoge.hoge.iを返します。
bindがネストしてると理解し辛くなりが、このくらいなら読みやすいと思えるようになってきました。