我在重塑这个平凡的方法调用转发类的车轮?(Am I reinventing the wheel wi

2019-07-29 10:15发布

我只是发现自己创建一个类

template <typename T> struct invoker {
  void operator()(T& it) const {it();}
};

所以我可以传递一个invoker<foo>到要调用的东西(这是不是我的控制之下) invoker<foo>::operator()(foo&)就可以反复用不同的foo的情况下,把它转发那些调用到foofoo::operator()()方法。

我知道这是只有几行,但是这似乎是诸如此类的事情,这可能是已经被STL的功能,提供或boost::bind莫名其妙。 除了我看不到的伎俩,如果有一个。 (我敢肯定,我不使用的东西非常喜欢这样的第一人;它有一个名字)

Answer 1:

是啊,你是重新发明轮子。 的std :: mem_fun_ref你想要做什么。

std::vector<foo> 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()));

不必惹你PARAM是否PTR与否是一个升压::的mem_fn大有裨益。

凡是远不止于此,虽然更复杂,你开始运行与C ++ 03粘合剂麻烦,需要更多的东西表现像boost.bind。



Answer 2:

那么,你可以使用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);
}

输出:

Hallo, im at addr: 0xbffc396a
Hallo, im at addr: 0xbffc3969

如果你使用模板类参数类型,你可以不重新发明轮子一样behvaiour。

编辑 :作为疯狂埃迪指出的那样,你可以使用boost::mem_fnstd::mem_fn

std::function<void(foo*)> fun = std::mem_fn(&foo::operator());

取而代之的bind



文章来源: Am I reinventing the wheel with this trivial method call forwarding class?