C++ 我是在用这个简单的方法调用转发类来重新发明轮子吗?
我刚刚发现自己正在创建一个类C++ 我是在用这个简单的方法调用转发类来重新发明轮子吗?,c++,templates,stl,functor,boost-bind,C++,Templates,Stl,Functor,Boost Bind,我刚刚发现自己正在创建一个类 template <typename T> struct invoker { void operator()(T& it) const {it();} }; 模板结构调用程序{ void运算符()(T&it)常量{it();} }; 因此,我可以将一个调用程序传递给希望使用不同的foo实例对其重复调用invoker::operator()(foo&)的某个对象(不在我的控制之下),以使其将这些调用转发给foo的foo::operator(
template <typename T> struct invoker {
void operator()(T& it) const {it();}
};
模板结构调用程序{
void运算符()(T&it)常量{it();}
};
因此,我可以将一个调用程序
传递给希望使用不同的foo
实例对其重复调用invoker::operator()(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);
}
如果将模板类用于参数类型,则可以使用相同的Behvaior,而无需重新设计轮子
Edit:正如疯狂的Eddie指出的,你可以使用boost::mem\u fn
或std::mem\u fn
:
std::function<void(foo*)> fun = std::mem_fn(&foo::operator());
std::function fun=std::mem_fn(&foo::operator());
而不是
bind
是的,你正在重新发明轮子。mem_fun_ref做你想做的事
std::vector<foo> foos;
...
std::for_each(foos.begin(), foos.end(), std::mem_fun_ref(&foo::operator()));
std::vector 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()));
std::vector foos;
...
std::for_each(foos.begin()、foos.end()、std::mem_fun(&foo::operator());
boost::mem_fn的一大好处是,不必担心您的参数是否为ptr
任何比这更复杂的东西,你开始在C++03绑定程序中遇到麻烦,需要一些更具表现力的东西,比如boost.bind。我认为C++11有一些东西可以解决这个问题,现在我使用的是g++4.4.5;我认为g++直到4.5才得到lambdas。好奇地想看到一个lambda解决方案,如果一个是张贴的话;在g++版本升级之前,我可以使用我的调用程序类。为什么不直接调用
foo::operator()
?我的意思是,调用invoker::operator()
的类必须执行类似some\u invoker(some\u foo)的操作代码>,而您可以这样称呼它:some_foo()代码>。您正在添加一个不必要的间接层。我不知道为什么您可能会使用这个类,而不是简单地使用T
作为函数类型。@DeadMG:(和其他人)不,这不起作用:我正在处理的东西的API(具体来说,TBB的parallel_for_)只允许我传入一个调用程序,然后在循环中使用foos作为连续参数调用它。这也是为什么我注意到更改代码不是一个选项;我当然可以想象更改它/创建一个变体来消除调用程序的需要,如果它是的话。实际上,这里不需要绑定,省略它是值得的。Bind必须通过一个参数转换系统来合并两个参数列表并调用目标callable。boost::mem_fn将完成这项任务,并实际为成员指针使用bind()。@CrazyEddie nice one,我不久前使用过mem_fn
,但完全忘记了它。编辑了我的回答:DOK这正是我想要感谢的事情;很明显,当你看到它的时候,我以某种方式说服自己(在这里太迟了),因为我感兴趣的foo方法没有参数,所以没有_1占位符的角色。。。错了。我指的是增强版,但标准版也很好用……几乎没有那么好。我想指出的是,在C++11中,std::mem_-fun
和std::mem_-fun\u-ref
都不推荐使用std::mem_-fn
。
std::vector<foo*> foos;
...
std::for_each(foos.begin(), foos.end(), std::mem_fun(&foo::operator()));