透明地配置std::function / lambda回调

Tranparently configure an std::function / lambda callback

本文关键字:lambda 回调 function 透明 配置 std      更新时间:2023-10-16

我有如下结构:它是一个对所有元素调用回调的容器。fct可以是lambda、函子或普通函数指针。

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

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 ?

我将创建callback的重载,并使用result参数。它看起来像这样:

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

但是这些解决方案需要我改变回调的签名,这样我就不能再用普通函数和函子调用它了。

本质上有两个不同的回调函数。一种使用中间值获取函数的方法。一个没有。有时你想要不同的签名,但功能大致相同。这就是重载的作用