error: invalid use of non-static member function



  • Ich habe eine member function

    struct Widget{
     void foo(int count = 100000) {
        for (int i = 1; i < count; ++i);
     }
     void execute(){
        std::invoke(foo, 100000);
    }
    };
    

    und versuche diese mittels std:.invoke in der execute function zu callen. dabei bekomme ich allerdings die oben gnenannte fehlermeldung. woran liegt das?



  • Die Frage solltest du mittlerweile selber beantworten können!

    https://en.cppreference.com/w/cpp/utility/functional/invoke

    If f is a pointer to member function of class T:

    • if std::is_base_of<T, std::decay_t<decltype(t1)>>::value is true, then INVOKE(f, t1, t2, ..., tN) is equivalent to (t1.*f)(t2, ..., tN)
      ...

    Fällt die was auf?



  • also wird im Falle einer member function versucht, diese mittels t1 zu invoken?

    verstehe den Syntax nicht so ganz um ehrlich zu sein 😕



  • Um eine member-function einer Klasse aufrufen zu können, brauchst du eine Instanz dieser Klasse. Wo soll die bei dir sein? (ok, execute ist hier selber eine member-function)
    Wie man das macht, steht in mannis link. Mal rein geguckt!?



  • natürlich, deshalb ja meine rückfrage nach dem Syntax.

    aber das aufrufen einer member function in einer anderen member function der gleichen klasse, funktioniert doch mittels implizitem this pointer, oder?

    @Jockelx: meine formatierung oben ist wohl etwas daneben ; )



  • Warum meinst du std::invoke überhaupt zu benötigen?



  • habe versucht, ein class template zu schreiben, mit dem ich die execution time jeder beliebigen funktion erfassen kann

    template<typename Time = std::chrono::microseconds, 
      typename Clock = std::chrono::high_resolution_clock>
    struct perf_timer {
      template<typename F, typename... Args>
      static Time duration(F &&f, Args... args) {
        auto start = Clock::now();
    
        std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
    
        auto end = Clock::now();
    
        return std::chrono::duration_cast<Time>(end - start);
      }
    };```


  • OK. Nun weißt du aber wie man diese Funktion mit einer Memberfunktion aufruft, oder?



  • ich fürchte nein



  • In dem Link von @manni66 ist doch als Beispiel:

    // invoke a member function
    const Foo foo(314159);
    std::invoke(&Foo::print_add, foo, 1);
    

    Und wenn du es aus der gleichen Klasse heraus aufrufst, dann eben *this als 2. Parameter angeben.



  • ich danke euch vielmals. Hatte nicht bis zur example section gelesen.

    Gibt es einen Grund obiges class template nicht als function template zu definieren?


Log in to reply