我用这个简单的方法调用转发类重新发明了轮子吗?

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情况下,得到它的呼叫转发到foofoo::operator()()方法.

我知道它只有几行,但这似乎是STL的功能或boost::bind某种方式已经提供的那种东西.除非我看不到诀窍,如果有的话.(我确定我不是第一个使用非常类似的东西的人;它有名字吗?)

mfo*_*ini 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);
}
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_fnstd::mem_fn:

std::function<void(foo*)> fun = std::mem_fn(&foo::operator());
Run Code Online (Sandbox Code Playgroud)

而不是bind.


Edw*_*nge 5

是的,你正在重新发明轮子.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更具表现力的东西.

  • 只想指出`std :: mem_fun`和`std :: mem_fun_ref`在C++ 11中被弃用为`std :: mem_fn`. (4认同)