如何編寫一個可以包裝任何函數並可以像函數本身一樣調用的包裝器?C++:函數包裝器,其功能本身就像函數本身
我需要這個的原因:我想要一個Timer對象,它可以包裝一個函數並像函數本身一樣運行,並記錄所有調用的累計時間。
的情況是這樣的:
// 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();
我怎麼可以這樣寫Timer
類?
我想是這樣的:
#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();
}
(順便說一句,我知道的gprof
等工具進行剖析運行,但有這樣一個Timer
對象登錄的一些特定功能,運行時更加方便。我的目的)
它必須是C++嗎?如果你不介意「讓你的手變髒」,你可能可以使用C的可變參數來攻擊一些東西... – 2009-05-19 02:00:35