【发布时间】:2012-05-15 23:41:47
【问题描述】:
我刚刚发现自己正在创建一个类
template <typename T> struct invoker {
void operator()(T& it) const {it();}
};
所以我可以将invoker<foo> 传递给想要用不同的foo 实例反复调用invoker<foo>::operator()(foo&) 的东西(它不在我的控制之下),让它将这些调用转发给@987654325 @ 的foo::operator()() 方法。
我知道它只有几行,但这似乎是 STL 的函数或 boost::bind 可能已经提供的那种东西。除了我看不到诀窍,如果有的话。 (我敢肯定我不是第一个使用这种东西的人;它有名字吗?)
【问题讨论】:
-
我认为 c++11 也有这个功能
-
现在我在 g++ 4.4.5;我认为 g++ 直到 4.5 才有 lambdas。如果发布了一个 lambda 解决方案,我很想知道;在 g++ 版本升级之前,我可以使用我的调用程序类。
-
你为什么不直接打电话给
foo::operator()?我的意思是,调用invoker::operator()的类必须执行类似some_invoker(some_foo);的操作,而您可以这样称呼它:some_foo();。您正在添加不必要的间接层。 -
我不知道为什么你会使用这个类而不是简单地使用
T作为函数类型。 -
@DeadMG: (和其他人)不,这不起作用:我正在处理的事情的 API(TBB 的 parallel_for_each,具体来说)只让我传入一个调用者,然后在以 foos 作为连续参数的循环中调用它。这也是为什么我注意到更改代码不是一种选择的原因。我当然可以想象改变它/创建一个变体来消除对调用者的需要。
标签: c++ templates stl functor boost-bind