На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> std::function , передать в метод класса функцию, которая является методом класса...
    Всем привет!

    Есть такой вот класс:
    ExpandedWrap disabled
      class SomeClass
      {
      private:
          std::string print(int number)
          {
              std::cout << number << std::endl;
              return "asdfdasf";
          }
       
          void Print(std::function<std::string(int)> pFn)
          {
              std::string str = pFn(5);
          }
       
      public:
          void Test()
          {
              std::function<std::string(int)> pFn = &SomeClass::print;
              Print(pFn); //! В идеале хотелось бы избежать строчки выше и написать что то типа -> Print(&SomeClass::print)
          }
      };


    Летит ошибка компиляции:
    ExpandedWrap disabled
      Severity    Code    Description Project File    Line    Suppression State
      Error   C2672   'std::invoke': no matching overloaded function found    ConsoleApplication2 c:\program files (x86)\microsoft visual studio 14.0\vc\include\type_traits  1441    
      Error   C2893   Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'    ConsoleApplication2 c:\program files (x86)\microsoft visual studio 14.0\vc\include\type_traits  1441

    Никак не могу ее победить. Может кто знает как тут надо правильно предать метод класса?

    Спасибо.

    Добавлено
    В общем мне нужно указатель на метод класса передать в метод класса, решил вот заморочится с std::function, да чего то не понимаю - почему не компилится.
    Вот тут вроде почти аналогичный код http://ru.cppreference.com/w/cpp/utility/functional/function
    За исключением того, что ему не передают в метод класса... :-?
    Сообщение отредактировано: KILLER -
      KILLER, а кто будет this-то передавать?
        Цитата D_KEY @
        KILLER, а кто будет this-то передавать?

        А куда его передавать? У меня же не лямбда и все происходит в этом классе? Я может не совсем понял тебя, просто еще нубас в этом. Можешь пояснить?
          Ну так сигнатура метода-то не std::string(int), а std::string SomeClass::(int). Нужно создавать std::function<std::string(SomeClass*, int)> и биндить this первым параметром.

          P.S. По крайней мере в бусте так делалось.

          Добавлено
          Цитата KILLER @
          А куда его передавать? У меня же не лямбда и все происходит в этом классе?
          std::function<>, увы, ничегошеньки не знает о том, что он используется внутри класса, и пытается схавать ту сигнатуру, что дают.
          Сообщение отредактировано: Qraizer -
            Да, так вроде получилось.
            Спасибо.

            Добавлено
            Вопрос решен.
              ExpandedWrap disabled
                class SomeClass
                {
                public:
                    std::string print(int number)
                    {
                        std::cout << number << std::endl;
                        return "asdfdasf";
                    }
                 
                    void Print(auto pFn)
                    {
                        std::string str = pFn(5);
                    }
                 
                    void Test()
                    {
                        Print(std::bind(&SomeClass::print, this, std::placeholders::_1)); //! В идеале хотелось бы избежать строчки выше и написать что то типа -> Print(&SomeClass::print)
                    }
                };
                Да вроде получилось как Qraizer написал:
                ExpandedWrap disabled
                  class SomeClass
                  {
                  private:
                      std::string print(int number)
                      {
                          std::cout << number << std::endl;
                          return "asdfdasf";
                      }
                   
                      void Print(std::function<std::string(SomeClass*, int)> pFn)
                      {
                          std::string str = pFn(this, 5);
                          std::cout << str;
                      }
                  public:
                      void Test()
                      {
                          Print(&SomeClass::print); //! В идеале хотелось бы избежать строчки выше и написать что то типа -> Print(&SomeClass::print)
                      }
                  };

                Но тоже спасибо за код.
                  Так в этом случае тебе и std::function не нужен.
                    Цитата Flex Ferrum @
                    Так в этом случае тебе и std::function не нужен.

                    Вот так же подумалось. Почему просто не использовать указатель на метод?
                      Так а зачем тогда этот std::function нужен? Без него в С как то обходятся, и в С++ обходились :-?
                        Цитата KILLER @
                        Так а зачем тогда этот std::function нужен? Без него в С как то обходятся, и в С++ обходились :-?

                        Для того, чтобы сохранять произвольный функтор(в терминах C++) с заданной сигнатурой.
                          KILLER, посмотри мой пример, там auto можно заменить на std::function<std::string(int)>.
                            Цитата D_KEY @
                            Для того, чтобы сохранять произвольный функтор(в терминах C++) с заданной сигнатурой.

                            Ну так его и так можно сохранить без всяких std::function
                            Я думал что std::funciton - это как бы замена для всяких указателей на функции, указателей на методы и т.д. Т.е. более общая и стандартная запись для таких вещей.

                            Цитата shm @
                            KILLER, посмотри мой пример, там auto можно заменить на std::function<std::string(int)>.

                            Да я смотрел. Но ведь весь смысл того что нужно было сделать сохранился. :-?

                            Добавлено
                            Просто я не могу понять, зачем тогда этот std::function вообще нужен? Если я и так могу функтор свой налабать и его передать, а если мне влом лабать функтор, то воспользуюсь лямбдой.
                            Сообщение отредактировано: KILLER -
                              Цитата KILLER @
                              Цитата D_KEY @
                              Для того, чтобы сохранять произвольный функтор(в терминах C++) с заданной сигнатурой.

                              Ну так его и так можно сохранить без всяких std::function

                              Как? Это может быть указатель на функцию, указатель на метод, объект-функция или лямбда. И всегда это будут разные типы.

                              Добавлено
                              Цитата KILLER @
                              Если я и так могу функтор свой налабать и его передать.

                              Передать ты можешь то, что ждут.

                              Цитата
                              если мне влом лабать функтор, то воспользуюсь лямбдой

                              Так у лямбд-то разный тип. Как ты это собрался хранить?
                                Цитата D_KEY @
                                Как? Это может быть указатель на функцию, указатель на метод, объект-функция или лямбда. И всегда это будут разные типы.

                                Ну в STL алгоритмы ты как то передаешь же функторы и указатели на функции.

                                Цитата D_KEY @
                                Передать ты можешь то, что ждут.

                                Ну так чем отличается то, что например ждет std::find_if, от std::function ?

                                Цитата D_KEY @
                                Так у лямбд-то разный тип. Как ты это собрался хранить?

                                Я не понимаю твоих вопросов, ты можешь написать такой пример, где бы вот без std::function ну никак нельзя было обойтись?
                                Если ты такой напишешь, то я его поколупаю и пойму для чего нужен этот std::function.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0438 ]   [ 16 queries used ]   [ Generated: 20.09.24, 18:07 GMT ]