Информация об изменениях

Сообщение Re[3]: Получить сигнатуру из ламбды от 18.08.2020 9:25

Изменено 18.08.2020 9:30 rg45

Re[3]: Получить сигнатуру из ламбды
Здравствуйте, Went, Вы писали:

W>Здравствуйте, rg45.

W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
W>Что-то такое:
W>
W>template<typename T>
W>auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
W>{
W>  std::function<typename stdext::call_traits<T>::signature> result = [fnc](???) // Вот что записать тут?
W>  {
W>    add_message_in_queue(???); // И тут
W>  };

W>  return result;
W>}
W>


Ну, если я правильно понял идею, то так:

template<typename T>
auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
{
  std::function<typename stdext::call_traits<T>::signature> result = [fnc](auto&&...args)  // Вот что записать тут?
  {
    add_message_in_queue(fnc(std::forward<decltype(args)>(args)...)); // И тут
  };

  return result;
}
Re[3]: Получить сигнатуру из ламбды
Здравствуйте, Went, Вы писали:

W>Здравствуйте, rg45.

W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
W>Что-то такое:
W>
W>template<typename T>
W>auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
W>{
W>  std::function<typename stdext::call_traits<T>::signature> result = [fnc](???) // Вот что записать тут?
W>  {
W>    add_message_in_queue(???); // И тут
W>  };

W>  return result;
W>}
W>


Ну, если я правильно понял идею, то так:

template<typename T>
auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
{
  std::function<typename stdext::call_traits<T>::signature> result = [fnc](auto&&...args)  // Вот что записать тут?
  {
    add_message_in_queue(fnc(std::forward<decltype(args)>(args)...)); // И тут
  };

  return result;
}


Хотя, из твоего описания, вроде бы, следует, что тут нужна еще одна обертка из std::function. Но там все по образу и подобию, как я показал.