मैं एक रैपर कैसे लिख सकता हूं जो किसी भी फ़ंक्शन को लपेट सकता है और इसे फ़ंक्शन की तरह ही कहा जा सकता है?सी ++: फ़ंक्शन रैपर जो फ़ंक्शन की तरह ही व्यवहार करता है
कारण मुझे इसकी आवश्यकता है: मुझे एक टाइमर ऑब्जेक्ट चाहिए जो फ़ंक्शन को लपेट सकता है और फ़ंक्शन की तरह ही व्यवहार कर सकता है, साथ ही यह सभी कॉलों के संचित समय को लॉग करता है।
परिदृश्य इस प्रकार दिखाई देगा:
// 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();
}
(Btw, मैं gprof
के बारे में पता है और क्रम रूपरेखा के लिए अन्य उपकरण है, लेकिन कुछ चयनित कार्यों का क्रम लॉग इन करने के इस तरह के एक Timer
वस्तु होने और अधिक सुविधाजनक है । मेरी प्रयोजनों के लिए)
क्या यह सी ++ होना चाहिए? यदि आपको "हाथों को गंदे होने" पर कोई फर्क नहीं पड़ता है, तो आप शायद सी के varargs का उपयोग करके कुछ हैक कर सकते हैं ... –