我感兴趣的是计算自由函数或成员函数(模板与否)的执行时间.调用TheFunc有问题的函数,它的调用是
TheFunc(/*parameters*/);
要么
ReturnType ret = TheFunc(/*parameters*/);
double duration = 0.0 ; std::clock_t start = std::clock(); TheFunc(/*parameters*/); duration = static_cast<double>(std::clock() - start) / static_cast<double>(CLOCKS_PER_SEC);
要么
double duration = 0.0 ; std::clock_t start = std::clock(); ReturnType ret = TheFunc(/*parameters*/); duration = static_cast<double>(std::clock() - start) / static_cast<double>(CLOCKS_PER_SEC);
但是我想做一些比这更优雅的事情,即(从现在起我将坚持使用void返回类型)如下:
Timer thetimer ; double duration = 0.0; thetimer(*TheFunc)(/*parameters*/,duration);
其中Timer是我想设计的一些时序类,这将允许我编写前面的代码,这样在前面代码的最后一行的exectution之后,double duration将包含执行时间
TheFunc(/*parameters*/);
但我不知道如何做到这一点,也不是我的目标语法/解决方案是最佳的…
解决方法
使用可变参数模板,您可以:
template <typename F,typename ... Ts> double Time_function(F&& f,Ts&&...args) { std::clock_t start = std::clock(); std::forward<F>(f)(std::forward<Ts>(args)...); return static_cast<double>(std::clock() - start) / static_cast<double>(CLOCKS_PER_SEC); }