C++ 完美的无效转发和非无效返回功能

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 =

以前,每当我想快速检查函数调用时,我都使用宏来测量它所花费的时间。现在,有了C++11,我想最终消除预处理器代码的丑陋和平,并将其替换为如下内容:

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)...);
}