Re[2]: Получить сигнатуру из ламбды
От: Went  
Дата: 18.08.20 09:06
Оценка:
Здравствуйте, rg45.
Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
Что-то такое:
void add_message_in_queue(const std::function<void()>&); // Эта функция ставит в очередь произвольный функтор без аргументов и возвратного значения.

// Эта функция должна взять произвольный функтор без возвратного значения, но с любым набором аргументов, и создать функтор с аргументами, который будет класть этот функтор в очередь, прибиндив аргументы
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](???) // Вот что записать тут?
  {
    add_message_in_queue(???); // И тут
  };

  return result;
}

void main()
{
  auto x = [](int, float){};
  auto y = defer(x);

  y(1, 1.0f); // Должен не вызвать реализацию x, а положить его в очередь, прибиндив единицы как аргументы вызова к x.
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.