Хранение любой лямбды как общего объекта обратного вызова в векторе - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть мечта. То, что я могу хранить лямбда-выражения, переданные функции в векторе, как объекты, заключенные в класс. Затем они запускаются в заданной точке позже, и если они имеют возвращаемое значение, оно получается.

Я пытался найти способ сделать это, например, мой другой пост застопорился Вектор с объектами, которые имеют функциональные указатели различного типа

Причина, по которой я так хочу, заключается в том, чтобы он был максимально динамичным и простым в любом сценарии. В текущем случае это будет использоваться в эволюционных алгоритмах, которые выполняют задачи в отдельных процессах и пространствах памяти.

Моя мечта неосуществима или плохой дизайн? Ты знаешь лучший способ? Я занимался этим уже несколько дней, и у меня ничего не компилируется.

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

В основном что-то вроде этого:

    std::vector<CallbackJob> myCallbackList;
    std::vector<CallbackJobResult> myCallbackResultList;

    Callback myCB = make_callback( [&]{ return Task->Test("I return boolean"); } );
    Callback myCB2 = make_callback( [&]{ return Foo("I return doubles"); } );

    CallbackJob job1("name1", myCB, 1);
    CallbackJob job2("name2", myCB2, 5);

    myCallbackList.push_back(job1);
    myCallbackList.push_back(job2);

    for(auto &i : myCallbackList) {
    // maybe need to check if it has a return value, embed it into the callback object itself?
        myCallbackResultList.push_back( i.callback() );  
    }

1 Ответ

0 голосов
/ 13 ноября 2018

Вы можете использовать тип стирания , например std::any и std::function, чтобы хранить лямбда-выражения и их результирующие значения в векторах:

std::vector<std::function<std::any()>> functions;
functions.emplace_back([]{ return std::any(1.0); });
functions.emplace_back([]{ return std::any(true); });

std::vector<std::any> results;
for (auto & f : functions)
  results.emplace_back(f());

Вопрос в том, как обрабатыватьэлементы results, так как вам нужно знать их типы, чтобы использовать их с std::any_cast.В этом примере вы можете использовать, например:

for (const auto & r : results)
  if (r.type() == typeid(double))
    std::cout << std::any_cast<double>(r);
  else if (r.type() == typeid(bool))
    std::cout << std::any_cast<bool>(r);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...