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?
- 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)
-
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?