5

我刚刚发现自己正在创建一个类

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

所以我可以将 an 传递invoker<foo>给想要invoker<foo>::operator()(foo&)用不同foo实例重复调用它的东西(它不在我的控制之下),以让它将这些调用转发给foo'sfoo::operator()()方法。

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

4

2 回答 2

6

好吧,您也可以使用std::bindboost::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

如果您对参数类型使用模板类,则无需重新发明轮子即可拥有相同的行为。

编辑:正如 Crazy Eddie 指出的那样,您可以使用boost::mem_fnor std::mem_fn

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

而不是bind.

于 2012-05-15T23:53:02.983 回答
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()));

boost::mem_fn 的一大好处是不必纠结你的参数是否是 ptr。

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

于 2012-05-16T00:19:25.967 回答