Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Arrays of functions help

Arrays of functions help

Scheduled Pinned Locked Moved Unsolved General and Desktop
16 Posts 5 Posters 4.4k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ? Offline
    ? Offline
    A Former User
    wrote on last edited by
    #7

    Hi! Or use a lambda:

    void MainWindow::sayHi()
    {
        qDebug() << "Hi!";
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        auto const count{10};
        std::array<std::function<void()>,count> myArray;
        for (auto &i : myArray) {
            i = [=]() { this->sayHi(); };
        }
    }
    
    1 Reply Last reply
    2
    • VRoninV VRonin

      try this code:

      #include <functional>
      #include <QDebug>
      class MyClass{
      public:
          MyClass()=default;
          void on_pushButton_clicked()
          {
          std::array<std::function<void()>,10> functions;
          for(int i = 0; i < 10; i++)
                  functions[i] = std::bind( &MyClass::readMe,this);
          for(int i = 0; i < 10; i++)
              functions[i]();
          }
          void readMe()
          {
              qDebug() << "I got read";
          }
      
      };
      
      int main()
      {
      MyClass tempClass;
      tempClass.on_pushButton_clicked();
      return 0;
      }
      

      It works for me... Make sure your pro file contains:

      CONFIG += c++11

      and re-run qmake

      EDIT:
      @Wieland is correct, std::array is preferable
      There is so much C++11 here I'm having an overdose!

      B Offline
      B Offline
      bwcal1999
      wrote on last edited by
      #8

      @VRonin said in Arrays of functions help:

      CONFIG += c++11

      I am using QTCreator 5.5.1 and still get the same error. not a member of std with both function and bind.

      Also with g++ it i get the same error.

      1 Reply Last reply
      0
      • VRoninV Offline
        VRoninV Offline
        VRonin
        wrote on last edited by
        #9

        In Qt Creator click on build->run qmake after you put CONFIG += c++11 in your .pro file

        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
        ~Napoleon Bonaparte

        On a crusade to banish setIndexWidget() from the holy land of Qt

        B 1 Reply Last reply
        0
        • VRoninV VRonin

          In Qt Creator click on build->run qmake after you put CONFIG += c++11 in your .pro file

          B Offline
          B Offline
          bwcal1999
          wrote on last edited by
          #10

          @VRonin yes I have done that several times.

          1 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by VRonin
            #11

            let's go C++11 mental!

            try this code in your main.cpp commenting out all the rest that's already there and tell me if it works and if not what does it complain about

            #include <functional>
            #include <array>
            #include <QDebug>
            class MyClass{
            public:
                void on_pushButton_clicked()
                {
                std::array<std::function<void()>,10> functions;
                std::fill(std::begin(functions),std::end(functions),std::bind( &MyClass::readMe,this));
                for(const auto& i : functions)
                    i();
                }
                void readMe()
                {
                    qDebug() << "I got read";
                }
            
            };
            int main()
            {
            MyClass tempClass;
            tempClass.on_pushButton_clicked();
            return 0;
            }
            

            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
            ~Napoleon Bonaparte

            On a crusade to banish setIndexWidget() from the holy land of Qt

            ? 1 Reply Last reply
            0
            • VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by
              #12

              This is the C++98 version of the code above

              #include <QDebug>
              
              class MyClass{
              public:
              
                  void on_pushButton_clicked()
                  {
              
                  void (MyClass::*functions[10])() ;
                  for(int i = 0; i < 10; ++i)
                      functions[i] = &MyClass::readMe;
                  for(int i = 0; i < 10; ++i)
                      (this->*functions[i])();
                  }
                  void readMe()
                  {
              
                      qDebug() <<  "I got read";
                  }
              
              };
              
              int main(int argc, char **argv)
              {
              MyClass tempClass;
              tempClass.on_pushButton_clicked();
              return 0;
              }
              

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              ? kshegunovK 2 Replies Last reply
              0
              • VRoninV VRonin

                This is the C++98 version of the code above

                #include <QDebug>
                
                class MyClass{
                public:
                
                    void on_pushButton_clicked()
                    {
                
                    void (MyClass::*functions[10])() ;
                    for(int i = 0; i < 10; ++i)
                        functions[i] = &MyClass::readMe;
                    for(int i = 0; i < 10; ++i)
                        (this->*functions[i])();
                    }
                    void readMe()
                    {
                
                        qDebug() <<  "I got read";
                    }
                
                };
                
                int main(int argc, char **argv)
                {
                MyClass tempClass;
                tempClass.on_pushButton_clicked();
                return 0;
                }
                
                ? Offline
                ? Offline
                A Former User
                wrote on last edited by
                #13

                @VRonin This is so retro, i want to watch Miami Vice on VHS now :-D

                1 Reply Last reply
                1
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #14

                  @Wieland Starwars on Super 8mm ;)

                  @bwcal1999 What Qt version, compiler (including version), OS are you using ?

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  0
                  • VRoninV VRonin

                    This is the C++98 version of the code above

                    #include <QDebug>
                    
                    class MyClass{
                    public:
                    
                        void on_pushButton_clicked()
                        {
                    
                        void (MyClass::*functions[10])() ;
                        for(int i = 0; i < 10; ++i)
                            functions[i] = &MyClass::readMe;
                        for(int i = 0; i < 10; ++i)
                            (this->*functions[i])();
                        }
                        void readMe()
                        {
                    
                            qDebug() <<  "I got read";
                        }
                    
                    };
                    
                    int main(int argc, char **argv)
                    {
                    MyClass tempClass;
                    tempClass.on_pushButton_clicked();
                    return 0;
                    }
                    
                    kshegunovK Offline
                    kshegunovK Offline
                    kshegunov
                    Moderators
                    wrote on last edited by
                    #15

                    @VRonin said in Arrays of functions help:

                    void (MyClass::*functions[10])() ;
                    

                    I hope you acknowledge most of us dinosaurs will typedef that. We are not masochists, only old-fashioned. ;)

                    Read and abide by the Qt Code of Conduct

                    1 Reply Last reply
                    0
                    • VRoninV VRonin

                      let's go C++11 mental!

                      try this code in your main.cpp commenting out all the rest that's already there and tell me if it works and if not what does it complain about

                      #include <functional>
                      #include <array>
                      #include <QDebug>
                      class MyClass{
                      public:
                          void on_pushButton_clicked()
                          {
                          std::array<std::function<void()>,10> functions;
                          std::fill(std::begin(functions),std::end(functions),std::bind( &MyClass::readMe,this));
                          for(const auto& i : functions)
                              i();
                          }
                          void readMe()
                          {
                              qDebug() << "I got read";
                          }
                      
                      };
                      int main()
                      {
                      MyClass tempClass;
                      tempClass.on_pushButton_clicked();
                      return 0;
                      }
                      
                      ? Offline
                      ? Offline
                      A Former User
                      wrote on last edited by A Former User
                      #16

                      @VRonin said in Arrays of functions help:

                      let's go C++11 mental!

                      Okay :-)

                      void MainWindow::on_pushButton_clicked()
                      {
                          std::array<std::function<void()>, 10> f;
                          std::fill(std::begin(f), std::end(f), [=](){this->sayHi();});
                          std::for_each(std::begin(f), std::end(f), [](auto &i){i();});
                      }
                      
                      1 Reply Last reply
                      3

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved