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

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

std::bind, std::mem_fnとメンバへのポインタ

C++

std::bindstd::mem_fnには、それぞれメンバへのポインタ(メンバ変数へのポインタとメンバ関数へのポインタ)を渡せる。std::bindstd::mem_fnの呼び出し方が違うので注意。

#include<iostream>
#include<functional>

struct cls{
 int mem_obj;
 cls(int value):mem_obj(value){}
 void mem_func()const{ std::cout << mem_obj + 1 << '\n'; }
};

int main(){
 {
  using std::bind;
  using std::placeholders::_1;

  cls a{0};

  auto mo = bind(&cls::mem_obj, _1);
  std::cout << mo(a) << '\n';

  auto mf = bind(&cls::mem_func, _1);
  mf(a);
 }
 {
  using std::mem_fn;
  
  cls a{10};

  auto mo = mem_fn(&cls::mem_obj);
  std::cout << mo(a) << '\n';

  auto mf = mem_fn(&cls::mem_func);
  mf(a);
 }
}

実行結果

0
1
10
11

@kikairoyaさんに教えてもらいました。