我发现自己创建了一个类
template <typename T> struct invoker {
void operator()(T& it) const {it();}
};
所以我可以将invoker<foo>
传递给某个(不受我控制)的东西,它想要用不同的invoker<foo>::operator()(foo&)
个实例重复调用foo
,以使其转发这些调用foo
的{{1}}方法。
我知道它只有几行,但这看起来像STL的功能或foo::operator()()
某种程度上已经提供的东西。除非我看不到诀窍,如果有的话。 (我敢肯定我不是第一个使用这种东西的人;它有名字吗?)
答案 0 :(得分:6)
好吧,您可以使用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而不重新发明轮子。
修改:正如Crazy Eddie指出的那样,您可以使用boost::mem_fn
或std::mem_fn
:
std::function<void(foo*)> fun = std::mem_fn(&foo::operator());
而不是bind
。
答案 1 :(得分:5)
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是boost :: mem_fn的一大好处。
任何比这更复杂的东西,你开始遇到C ++ 03绑定器的麻烦,需要像boost.bind更具表现力的东西。