我有类似下面的结构。这是一个在其所有元素上调用回调的容器。 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)>){
        }
    }
    



    本质上有两个不同的回调函数。一个使用中间值的函数。一个没有。有时您需要不同的签名来完成大致相同的操作。这就是重载的目的:)。

    关于c++ - 透明地配置std::function/lambda回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30344211/

    10-10 21:26