我刚刚发现自己创建了一个类
template <typename T> struct invoker {
void operator()(T& it) const {it();}
};
这样我就可以通过invoker<foo>
到想要调用的东西(不在我的控制之下)invoker<foo>::operator()(foo&)
反复用不同的foo
实例,让它将这些呼叫转发到foo
's foo::operator()()
method.
我知道它只有几行,但这似乎是 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);
}
Outputs:
Hallo, im at addr: 0xbffc396a
Hallo, im at addr: 0xbffc3969
如果您使用模板类作为参数类型,则无需重新发明轮子即可获得相同的行为。
Edit:正如疯狂埃迪指出的那样,你可以使用boost::mem_fn
or std::mem_fn
:
std::function<void(foo*)> fun = std::mem_fn(&foo::operator());
代替bind
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)