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

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

Изменено 18.08.2020 9:22 Маркуша Шулин

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

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

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

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>void main()
W>{
W>  auto x = [](int, float){};
W>  auto y = defer(x);

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

W>



так чтобы по быстрому. можно выдрать из сигнатуры тупл и т/к это локальная лямбда, в смысле не влияет на внешний интерфейс ? если да, то
    typedef typename convert_2args_type<typename stdext::call_traits<T>::signature>::type args_tuple_type;
    std::function<typename stdext::call_traits<T>::signature> result = [fnc](args_tuple_type const& args)
     {
            // Здесь форейч по всем аргументам и в конце итерации вызов непосредственно функции 
        call_func_add_message_in_queue<0>(args);
        
     };
Re[3]: Получить сигнатуру из ламбды
Здравствуйте, Went, Вы писали:

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

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

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>void main()
W>{
W>  auto x = [](int, float){};
W>  auto y = defer(x);

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

W>



так чтобы по быстрому. можно выдрать из сигнатуры тупл и т/к это локальная лямбда, в смысле не влияет на внешний интерфейс ? если да, то
    typedef typename convert_2args_type<typename stdext::call_traits<T>::signature>::type args_tuple_type;
    std::function<typename stdext::call_traits<T>::signature> result = [fnc](args_tuple_type const& args)
     {
            // Здесь форейч по всем аргументам и в конце итерации вызов непосредственно функции 
        call_func_add_message_in_queue<0>(args);
        
     };

если же у тебя внешний интерфейс и локальная типизация извне не видна можно пихать в некий абстрактнфй тип вроде boost::any кастить перед вызовом.