Tranparently配置std :: function / lambda回调

时间:2015-05-20 08:26:54

标签: c++ c++11 lambda

我有类似以下结构的东西。它是一个容器,它调用所有元素的回调。 fct可以是lambda,functor或普通函数指针。

现在,在某些情况下,我希望在调用它之前选择配置fct。例如,fct计算每个x上的复杂函数。但是ContainerX已经知道了一个中间结果 - 我想告诉fct中间结果。如果fct是一个仿函数,它有一个状态,它可以存储中间的rsult。如果它是普通函数,则它不能存储中间结果,应该在没有预配置的情况下调用。

class ContainerX{
    void callback(function<void(X* x)> fct){
        // 1. Tell fct the intermediate result, if it is able to be configured
        // 2. Call fct for all x in the container
    }  
}

基本上有很多方法可以做到这一点:

  • 我可以将fct定义为function<void(X* x, double result)>
  • 我可以将fct定义为具有实际功能和预配置功能的抽象类。

但是这些解决方案要求我以一种我不能再用普通函数和函子调用它的方式来改变callback的签名。

有没有办法透明地,可选地配置fct

1 个答案:

答案 0 :(得分:3)

我会创建callback的重载确实使用result参数。它看起来像这样:

class ContainerX{
    void callback(function<void(X* x)> fct){  
    }  
    void callback(function<void(X* x, double result)>){   
    }  
}
  

但是这些解决方案要求我以一种我不能再用普通函数和函子调用它的方式来改变回调的签名。

本质上有两种不同的回调函数。使用中间值的函数。一个没有的。有时您需要不同的签名,这些签名大致相同。这是什么重载:)。