Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是在用这个简单的方法调用转发类来重新发明轮子吗?_C++_Templates_Stl_Functor_Boost Bind - Fatal编程技术网

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()));