Wie kann ich einen Wrapper schreiben, der jede Funktion umbrechen kann und genau wie die Funktion selbst aufgerufen werden kann?C++: Funktionswrapper, der sich genau wie die Funktion selbst verhält
Der Grund, warum ich das brauche: Ich möchte ein Timer-Objekt, das eine Funktion umhüllen und sich genau wie die Funktion selbst verhalten kann, und es protokolliert die akkumulierte Zeit aller seiner Aufrufe.
würde das Szenario wie folgt aussehen:
// a function whose runtime should be logged
double foo(int x) {
// do something that takes some time ...
}
Timer timed_foo(&foo); // timed_foo is a wrapping fct obj
double a = timed_foo(3);
double b = timed_foo(2);
double c = timed_foo(5);
std::cout << "Elapsed: " << timed_foo.GetElapsedTime();
Wie kann ich diese Timer
Klasse schreiben?
Ich versuche, so etwas wie dieses:
#include <tr1/functional>
using std::tr1::function;
template<class Function>
class Timer {
public:
Timer(Function& fct)
: fct_(fct) {}
??? operator()(???){
// call the fct_,
// measure runtime and add to elapsed_time_
}
long GetElapsedTime() { return elapsed_time_; }
private:
Function& fct_;
long elapsed_time_;
};
int main(int argc, char** argv){
typedef function<double(int)> MyFct;
MyFct fct = &foo;
Timer<MyFct> timed_foo(fct);
double a = timed_foo(3);
double b = timed_foo(2);
double c = timed_foo(5);
std::cout << "Elapsed: " << timed_foo.GetElapsedTime();
}
(BTW, ich kenne gprof
und andere Werkzeuge zur Laufzeitprofilierung, sondern eine solche mit Timer
Objekt die Laufzeit von wenigen ausgewählten Funktionen zu protokollieren ist bequemer . für meine Zwecke)
Muss es C++ sein? Wenn es dir nichts ausmacht, "deine Hände schmutzig zu machen", kannst du wahrscheinlich etwas mit Cs varargs hacken ... –