如何将boost :: bind对象存储为成员变量?

时间:2014-05-05 10:03:48

标签: c++ boost bind functor

我正在使用boost :: bind来动态创建组合函数,并希望将对象存储为某个类成员变量以供以后使用。例如,我们有两个仿函数:

struct add{double operator()(double x, double y) const{return x+y;};};  
struct multiply{double operator()(double x, double y) const{return x*y;};};  

然后创建函数f(x,y,z)=(x + y)* z,我可以这样做:

auto f = boost::bind<double>(multiply(), boost::bind<double>(add(), _1, _2), _3);

调用f(x,y,z)非常有效。现在我想将f保存为类成员变量,如下所示:

struct F  
{  
  auto func;  
  double operator(const std::vector<double>& args) const  
  {  
    return func(args[0],args[1],args[2]); //Skipping boundary check  
  }  
}

F f_obj;  
f_obj.func = f;  
f_obj(args);  

但当然我不能声明一个自动变量。有没有办法解决这个问题?

请注意,我没有使用boost :: function,因为它会极大地影响性能,这对我很重要。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:5)

两个选项:使用boost::function,并衡量它是否实际影响效果。

或者使F为模板,将func的类型作为参数,并从bind表达式的类型中推导出来。

编辑:第二个选项的问题是它没有摆脱笨拙的类型。您可以通过使用模板覆盖的纯虚函数定义基类来实现。但是,您需要管理动态内存以及支付虚拟功能的成本 - 因此您可以回到boost::function(或std::function),这对您做同样的事情。

答案 1 :(得分:3)

bind()返回的类型特定于函数对象和参数的每个组合。如果要存储结果,则需要以某种方式擦除类型。显而易见的方法是使用function<..>

当频繁调用生成的函数对象时,function<...>有效地执行虚拟调度所引入的开销可能过高。解决该问题的一种方法是将函数对象与适当的批量操作捆绑在一起,而不是存储函数对象以存储合适的应用程序。当需要单独呼叫时,这不会有帮助,但是当需要大量呼叫时,虚拟调度只需支付一次。