mem_funとmem_fnは、どっちかどっちか分からなくなる

2014年3月3日

お久しぶりです。最底辺です。
C++のカオスな部分としてmem_funとmem_fnやbindがあります。
bindは、私がついて行けていないので今日はmem_funとmem_fnのお話。
mem_funは、標準ライブラリで昔からあったものでクラスのメンバ関数などを
関数ポインタとしてつかうことが出来て大変便利です。
for_eachなどで引数として渡すことも出来ます。

class Object{
void func(){...};
};
vector<Object*> vp;
vp.push_back(new Object());
for_each(vp.begin,vp.end, mem_fun(&Object::func));

しか~し、実際には、引数を取る関数を渡したりすることは出来ず、参照として渡すこともできないです。
(参照用には、mem_fun_refなるものを使えといわれます。)

Object obj;
vector<Object> vec;
vec.push_back(Object());
//for_each(vec.begin,vec.end, mem_fun(&Object::func); <- NG
for_each(vec.begin,vec.end,, mem_fun);

そこで、偉大なboostにありまするmem_fnの出番です。
こいつを使えば、ポインタ版と参照版両方で使える。

class Object{
void func(){...};
};
vector<Object*> vp;
vp.push_back(new Object());
for_each(vp.begin,vp.end, mem_fn(&Object::func));
vector<Object> vec;
vec.push_back(Object());
for_each(vp.begin,vp.end, mem_fn(&Object::func));

ということで、みんなmem_funいや、mem_fnあれ?どっちだっけ、
まあとにかく便利なのを活用しましょう。

c++

Posted by koheizi