我只是发现自己创建一个类
template <typename T> struct invoker {
void operator()(T& it) const {it();}
};
所以我可以传递一个invoker<foo>
到要调用的东西(这是不是我的控制之下) invoker<foo>::operator()(foo&)
就可以反复用不同的foo
的情况下,把它转发那些调用到foo
的foo::operator()()
方法。
我知道这是只有几行,但是这似乎是诸如此类的事情,这可能是已经被STL的功能,提供或boost::bind
莫名其妙。 除了我看不到的伎俩,如果有一个。 (我敢肯定,我不使用的东西非常喜欢这样的第一人;它有一个名字)
是啊,你是重新发明轮子。 的std :: mem_fun_ref你想要做什么。
std::vector<foo> foos;
...
std::for_each(foos.begin(), foos.end(), std::mem_fun_ref(&foo::operator()));
或者:
std::vector<foo*> foos;
...
std::for_each(foos.begin(), foos.end(), std::mem_fun(&foo::operator()));
不必惹你PARAM是否PTR与否是一个升压::的mem_fn大有裨益。
凡是远不止于此,虽然更复杂,你开始运行与C ++ 03粘合剂麻烦,需要更多的东西表现像boost.bind。
那么,你可以使用std::bind
,可能boost::bind
以及实现相同的行为:
#include <string>
#include <iostream>
#include <functional>
struct foo {
void operator()() {
std::cout << "Hallo, im at addr: " << std::hex << this << std::endl;
}
};
int main() {
std::function<void(foo*)> fun = std::bind(&foo::operator(), std::placeholders::_1);
foo f1, f2;
fun(&f1);
fun(&f2);
}
输出:
Hallo, im at addr: 0xbffc396a
Hallo, im at addr: 0xbffc3969
如果你使用模板类参数类型,你可以不重新发明轮子一样behvaiour。
编辑 :作为疯狂埃迪指出的那样,你可以使用boost::mem_fn
或std::mem_fn
:
std::function<void(foo*)> fun = std::mem_fn(&foo::operator());
取而代之的bind
。