プログラミング楽しい
おひさしぶりです。
今回は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がネストしてると理解し辛くなりが、このくらいなら読みやすいと思えるようになってきました。