【问题标题】:How to store a functor for later invocation in C++如何存储函子以供以后在 C++ 中调用
【发布时间】:2019-03-02 14:22:53
【问题描述】:

这个问题可能很幼稚,如果是,请在我学习时原谅我。

请考虑以下类似 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;

}

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

那么在不使用 boost 或其他非标准依赖项的情况下,我将如何以最简单的方式在现代 C++ 中执行此操作?

有哪些选择和注意事项?

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

我要存储的回调也可以是不同的形式,例如独立函数、成员函数或 lambda。

【问题讨论】:

标签: c++ lambda callback invoke functor


【解决方案1】:

像这样修改结构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); });

【讨论】:

  • 谢谢,这很有用!
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
相关资源
最近更新 更多