На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> std::function как её передать?
    Среда VS 2019 - стандарт языка С++ 17

    Есть функция которая устанавливает слушатель функцию которая будет вызываться после получения данных.

    data.AddListener(здесь нужно передать её коллбэк функцию) в описании к ней сказано: AddListener(std::function<...> callback) Starts listening to the events referenced by this query.

    Пробую сделать так:

    ExpandedWrap disabled
      data.AddListener(
              [](const int& nData) {
                       TRACE("DATA GET");
              });


    Выходит ошибка:
    Ошибка C2664 "AddListener(std::function<void (const int nData&,)>)": невозможно преобразовать аргумент 2 из "CBaseDlg::OnBnClickedButton2::<lambda_9d0c56e373295f07cbd348335aa377ff>" в "std::function<void (int nData&)>" Base C:\Base\BaseDlg.cpp 92

    Что то про лямбду пишет. Не пойму как передать коллбэк функцию через std::function?
      Судя по ошибке, ты AddListener принимает тип std::function<void (int &)>, а лямбда преобразуется к типу std::function<void (const int &)>. Добавь const в AddListener или убери его из лямбды. А то и вообще сделай std::function<void(int)>. Смысла в передаче по ссылке int-ов нет никакого.
        const убрал, ничего не изменилось:
        невозможно преобразовать аргумент 1 из <lambda_9d0c56e373295f07cbd348335aa377ff>" в "std::function<void (int nData&)>

        Мне кажется, я как-то не так синтаксис использую.
        Не пойму как использовать эту конструкцию - [].

        Менять AddListener нельзя, он в SDK библиотеки приходит. А int - я для упрощения написал.
        Сообщение отредактировано: MaIron -
          Что-то ты не договариваешь по-моему.
          Ну попробуй сперва присвоить лямбду в переменную нужного типа, а потом уже передать:
          ExpandedWrap disabled
            std::function<void (int &)> func = [](int& nData) {
                             TRACE("DATA GET");
                    };
            data.AddListener(func);
            ExpandedWrap disabled
              std::function<void (int &)> func = [](int& nData) {
                               TRACE("DATA GET");
                      };
              data.AddListener(func);

            Супер! Спасибо! Так заработало!
            Сообщение отредактировано: MaIron -
              Цитата OpenGL @
              Что-то ты не договариваешь по-моему.
              Однозначно. Наверняка AddListener перегружен, бо в первом случае явно просится второй параметр, которого нет.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0245 ]   [ 16 queries used ]   [ Generated: 16.04.24, 12:27 GMT ]