问题描述
我已经为测量函数运行时间编写了类。它的工作正常。但是,当我开始在我的项目中使用它来测量类方法的速度时,它会因以下错误而中断:
这是我的测量函数:
template<typename F,typename... Args>
decltype(auto) Time::timer(F function,Args&&... args){
auto start = std::chrono::steady_clock::Now();
auto ret = function(std::forward<Args>(args)...);
auto end = std::chrono::steady_clock::Now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
return ret;
}
如何将类方法传递给我的函数,或者如何编写测量类方法速度的函数?
解决方法
最简单的解决方案是将成员函数的调用包装在 lambda 中,并将其作为函数参数传递给 Time::timer
:
struct Foo {
double bar(double d) { return d; }
};
// ...
Foo f;
auto result = Time::timer([&f]{return f.bar(3.1415);});
或者,如果为 Time::timer
添加重载,也可以直接调用成员函数:
template<typename F,typename T,typename... Args>
decltype(auto) timer(F&& func,T& obj,Args&&... args){
auto start = std::chrono::steady_clock::now();
auto ret = (obj.*func)(std::forward<Args>(args)...); // call member fn
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
return ret;
}
// ...
Foo f;
auto result = Time::timer(&Foo::bar,f,3.1415);