Squeak.ru - шаблоны программирования

std::bind к std::function с возвращаемым значением

Я столкнулся с некоторыми трудностями при использовании преобразования функции-члена в std::function с помощью std::bind. Я использую g++ 7.3.0 и -std=c++11, и компилятор сообщает:

../untitled2/main.cpp:25:42: error: no match for call to ‘(a) (std::_Bindres_helper<short int, short int (b::*)(), b>::type, int16_t*)’
   a0(std::bind<int16_t>(&b::run, b()), &r);
                                          ^
../untitled2/main.cpp:7:8: note: candidate: template<class t_result> void a::operator()(std::function<t_result()>&&, t_result*)
   void operator()(std::function<t_result()>&& p_function, t_result* p_result)
        ^~~~~~~~
../untitled2/main.cpp:7:8: note:   template argument deduction/substitution failed:
../untitled2/main.cpp:25:42: note:   ‘std::_Bindres_helper<short int, short int (b::*)(), b>::type {aka std::_Bind_result<short int, short int (b::*(b))()>}’ is not derived from ‘std::function<t_result()>’
   a0(std::bind<int16_t>(&b::run, b()), &r);

когда он пытается скомпилировать этот код:

     1  #include <chrono>
     2  
     3  
     4  struct a
     5  {
     6    template<typename t_result>
     7    void operator()(std::function<t_result()>&& p_function, t_result* p_result)
     8    {
     9      *p_result = p_function();
    10    }
    11  };
    12  
    13  struct b
    14  {
    15    int16_t run() { return -5; }
    16  };
    17  
    18  int
    19  main()
    20  {
    21    a a0;
    22  
    23    int16_t r;
    24  
    25    a0(std::bind<int16_t>(&b::run, b()), &r);
    26  
    27    return 1;
    28  }

Но компилятор компилирует этот код:

     1  #include <chrono>
     2  
     3  
     4  struct a
     5  {
     6    template<typename t_result>
     7    void operator()(std::function<t_result()>&& p_function, t_result* p_result)
     8    {
     9      *p_result = p_function();
    10    }
    11  };
    12  
    13  struct b
    14  {
    15    int16_t run() { return -5; }
    16  };
    17  
    18  int
    19  main()
    20  {
    21    a a0;
    22  
    23    int16_t r;
    24  
    25    std::function<int16_t()> f = std::bind<int16_t>(&b::run, b());
    26  
    27    a0(std::move(f), &r);
    28  
    29    return 1;
    30  }

Итак, почему второй код компилируется, а первый нет, если, насколько мне известно, я передаю a::operator() один и тот же объект в обоих случаях.

Большое спасибо за ваше время!

25.01.2019

  • Подсказка: во втором примере замени std::function<int16_t()> f = на auto f =, посмотри, компилируется ли, и можно ли из этого что-то сделать. 25.01.2019
  • Вместо этого использовать лямбду? 25.01.2019
  • есть только несколько случаев, когда вам нужно использовать std::bind, лямбда-выражения намного приятнее 25.01.2019
  • @MatthieuBrucher У лямбды будет такая же проблема 25.01.2019
  • Двойник, который я использовал, касается лямбды, но у std::bind точно такая же проблема. Везде, где вы видите лямбда, просто притворитесь, что там написано std::bind 25.01.2019
  • Я ценю все комментарии, но я до сих пор не понимаю, почему выполнение std::function<int16_t()> f = std::bind<int16_t>(&b::run, b());, а затем a0(std::move(f), &r); работает, а a0(std::bind<int16_t>(&b::run, b()), &r); не работает, насколько мне известно, один и тот же код. 25.01.2019

Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...