Как сохранить функтор для последующего вызова в C ++ - PullRequest
0 голосов
/ 02 марта 2019

Этот вопрос может быть наивным, если так, пожалуйста, прости меня, когда я учусь.

Пожалуйста, рассмотрите следующий 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 или других нестандартных зависимостей?

Какие есть варианты и предостережения?

Следует отметить, что подпись обратного вызова известна заранее и не изменится.

Кроме того, обратный вызов, который я хочу сохранить, может иметь различные формы, такие как отдельная функция, функция-член или лямбда-выражение.

1 Ответ

0 голосов
/ 02 марта 2019

Измените структуру 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 () используйте лямбду для передачи функции-члена в качестве параметра следующим образом:

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