C++ 完美的无效转发和非无效返回功能
以前,每当我想快速检查函数调用时,我都使用宏来测量它所花费的时间。现在,有了C++11,我想最终消除预处理器代码的丑陋和平,并将其替换为如下内容:C++ 完美的无效转发和非无效返回功能,c++,c++11,overloading,rvalue-reference,C++,C++11,Overloading,Rvalue Reference,以前,每当我想快速检查函数调用时,我都使用宏来测量它所花费的时间。现在,有了C++11,我想最终消除预处理器代码的丑陋和平,并将其替换为如下内容: template <typename Functor, typename ... Args> auto measure(Functor f, Args && ... args) -> decltype(f(std::forward<Args>(args)...)) { auto now =
template <typename Functor, typename ... Args>
auto measure(Functor f, Args && ... args)
-> decltype(f(std::forward<Args>(args)...))
{
auto now = std::chrono::high_resolution_clock::now();
auto ret = f(std::forward<Args>(args)...);
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::high_resolution_clock::now() - now).count();
std::cout << "Time elapsed: " << elapsed << "ms" << std::endl;
return ret;
}
有办法解决这个问题吗
更新 感谢R.Martinho Fernandes,以下是我现在使用的函数:
template <typename Functor, typename ... Args>
auto measure(Functor f, Args && ... args)
-> decltype(f(std::forward<Args>(args)...))
{
struct scoped_timer
{
scoped_timer() : now_(std::chrono::high_resolution_clock::now()) {}
~scoped_timer()
{
auto elapsed = std::chrono::duration_cast<
std::chrono::milliseconds
>(std::chrono::high_resolution_clock::now() - now_).count();
std::cout << "Time elapsed: " << elapsed << "ms" << std::endl;
}
private:
std::chrono::high_resolution_clock::time_point const now_;
} scoped_timer;
return f(std::forward<Args>(args)...);
}
模板
自动测量(函子f,Args&…Args)
->decltype(f(std::forward(args)…)
{
结构作用域计时器
{
作用域计时器():now(std::chrono::high_resolution_clock::now()){}
~scoped_timer()
{
自动运行=标准::计时::持续时间<
std::chrono::毫秒
>(std::chrono::高分辨率时钟::now()-now)。计数();
std::cout问题是默认模板参数不能用于不同的模板,就像默认函数参数不能用于不同的重载一样。有一些方法可以解决这个问题,我在我的文章中描述了它们
但是,我不会这样做。我只想利用这样一个事实,即在通用代码中,您可以“return
void”,并使用RAII打印经过的时间:
template <typename Functor, typename ... Args>
auto measure(Functor f, Args && ... args)
-> decltype(f(std::forward<Args>(args)...))
{
scoped_timer timer;
return f(std::forward<Args>(args)...);
}
模板
自动测量(函子f,Args&…Args)
->decltype(f(std::forward(args)…)
{
作用域定时器;
返回f(标准::转发(参数)…);
}
scoped\u timer
类可以编写得很简单:现在在构造函数中保存now
,在析构函数中计算并输出appead
。参见优雅(by)。我唯一要做的更改是放置~scoped\u timer()
的代码在一个try catch
块中,该块会吞下任何抛出的异常。从语义上讲,我认为如果它不能成功完成,不报告f
运行所需的时间是有意义的。不幸的是,对于抛出的可能异常,这一点并不明显。事实上,我做了类似于这之前,我刚刚删除了结果值,让measure
返回经过的时间。你的文章非常有趣。谢谢。我仍然希望返回函数最初返回的值,但你的解决方案正好可以。
template <typename Functor, typename ... Args>
auto measure(Functor f, Args && ... args)
-> decltype(f(std::forward<Args>(args)...))
{
scoped_timer timer;
return f(std::forward<Args>(args)...);
}