如何将函子存储在C 中以后调用

How to store a functor for later invocation in C++

本文关键字:调用 存储      更新时间:2023-10-16

这个问题可能是天真的,如果是这样,请在我学习时原谅我。

请考虑以下C - 喜欢伪代码

#include <iostream>
#include <string>
#include <functional>

struct A{
    bool doSomething(int in){
        std::cout<<"SOMETHING WAS DONE THAT DAY: "<<in<<std::endl;
        return true;
    }
};
struct B{
    std::function executor;
    void setExecutor(std::function f){
        executor=f;
    }
    bool doSomethingLater(int in){
        return executor(in);
    }
};
static bool yoloFunction(int in){
    std::cout<<"LIVING LA VIDA LOCA: "<<in<<std::endl;
    return false;
}

int main()
{
  A myExecutor;
  B lazyAss;
  // Storing member function for later invocation
  lazyAss.setExecutor(&myExecutor::doSomething);
  bool result_1 = lazyAss.doSomethingLater(1337);
  std::cout<<"The first result is "<<result_1<<std::endl;
  // Storing regular function for later invocation
  lazyAss.setExecutor(&yoloFunction);
  bool result_3 = lazyAss.doSomethingLater(42);
  std::cout<<"The second result is "<<result_2<<std::endl;
  // Storing lambda function for later invocation
  lazyAss.setExecutor([=](int in){
    std::cout<<"P- P- P- POKERFACE!: "<<in<<std::endl;
    return true;
  });
  bool result_3 = lazyAss.doSomethingLater(666);
  std::cout<<"The third result is "<<result_3<<std::endl;
}

它应该说明我要完成的工作,即存储某种回调,以供以后调用

那么,我将如何以最简单的方式在现代C 中执行此操作,而无需使用Boost或其他非标准依赖关系?

有哪些选择和警告?

要注意的事情是,回调的签名是事先知道的,不会更改。

我要存储的回调可能具有不同的形式,例如独立函数,成员函数或lambda。

像这样修改结构B:

struct B {
    std::function<bool(int)> executor;
    void setExecutor(std::function<bool(int)> f) {
        executor = f;
    }
    bool doSomethingLater(int in) {
        return executor(in);
    }
};

在main()中,使用lambda以这样的参数传递成员函数:

lazyAss.setExecutor([&](int i)->bool { return myExecutor.doSomething(i); });