tim*_*day 5 c++ templates stl boost-bind functor
我发现自己创造了一堂课
template <typename T> struct invoker {
void operator()(T& it) const {it();}
};
Run Code Online (Sandbox Code Playgroud)
所以我可以传递一个invoker<foo>
到要调用的东西(这是不是我的控制之下),invoker<foo>::operator()(foo&)
就可以反复用不同的foo
情况下,得到它的呼叫转发到foo
的foo::operator()()
方法.
我知道它只有几行,但这似乎是STL的功能或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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
Hallo, im at addr: 0xbffc396a
Hallo, im at addr: 0xbffc3969
Run Code Online (Sandbox Code Playgroud)
如果您为参数类型使用模板类,则可以在不重新发明轮子的情况下使用相同的behvaiour.
编辑:正如Crazy Eddie指出的那样,你可以使用boost::mem_fn
或std::mem_fn
:
std::function<void(foo*)> fun = std::mem_fn(&foo::operator());
Run Code Online (Sandbox Code Playgroud)
而不是bind
.
是的,你正在重新发明轮子.std :: mem_fun_ref做你想要的.
std::vector<foo> foos;
...
std::for_each(foos.begin(), foos.end(), std::mem_fun_ref(&foo::operator()));
Run Code Online (Sandbox Code Playgroud)
或者:
std::vector<foo*> foos;
...
std::for_each(foos.begin(), foos.end(), std::mem_fun(&foo::operator()));
Run Code Online (Sandbox Code Playgroud)
不必弄乱你的param是否是ptr是boost :: mem_fn的一大好处.
任何比这更复杂的东西,你开始遇到C++ 03绑定器的麻烦,需要像boost.bind更具表现力的东西.
归档时间: |
|
查看次数: |
503 次 |
最近记录: |