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

时间:2012-05-15 23:41:48

标签: c++ templates stl functor boost-bind

我发现自己创建了一个类

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

所以我可以将invoker<foo>传递给某个(不受我控制)的东西,它想要用不同的invoker<foo>::operator()(foo&)个实例重复调用foo,以使其转发这些调用foo的{​​{1}}方法。

我知道它只有几行,但这看起来像STL的功能或foo::operator()()某种程度上已经提供的东西。除非我看不到诀窍,如果有的话。 (我敢肯定我不是第一个使用这种东西的人;它有名字吗?)

2 个答案:

答案 0 :(得分: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);
}

输出:

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

如果您为参数类型使用模板类,则可以使用相同的behvaiour而不重新发明轮子。

修改:正如Crazy Eddie指出的那样,您可以使用boost::mem_fnstd::mem_fn

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

而不是bind

答案 1 :(得分:5)

是的,你正在重新发明轮子。 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是boost :: mem_fn的一大好处。

任何比这更复杂的东西,你开始遇到C ++ 03绑定器的麻烦,需要像boost.bind更具表现力的东西。