首页 > 解决方案 > 对任何其他任意函数计时并返回其结果的函数

问题描述

我正在尝试编写一个函数,该函数接受任何其他任意函数作为输入并对其计时,然后返回该函数的结果。我已经做了几个小时了,我觉得我已经很接近了,但我仍然不知道如何让它编译。

这是我到目前为止所拥有的:

// Some arbitrary function to pass to the timer
int DoSomething(int x, double y)
{
    // Does something with x and y
    return 0;
}

// Function used to time another function and return its result
template <typename T, typename Function, typename... Args>
T GetRuntime(const std::string& name, const Function& function, Args&&... args)
{
    std::cout << name << " started..." << std::endl;
    auto start = std::chrono::high_resolution_clock::now();

    T result = function(std::forward<Args>(args)...);

    auto stop = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(stop - start);
    std::cout << name << " complete - duration: " << duration.count() << " milliseconds." << std::endl;

    return result;
}

int main()
{
    // Doesn't compile
    int output = GetRuntime("DoSomething", DoSomething, 42, 42.42);
}

我以正确的方式接近这个吗?如果是这样,我需要改变什么才能使这项工作?如果没有,解决这个问题的更好方法是什么?

标签: c++templatesgeneric-programming

解决方案


这里的问题是T在你的函数中是不可推导出的。您分配返回的值不参与模板参数扣除。要按原样使用它,您需要通过使用指定返回类型

int output = GetRuntime<int>("DoSomething", DoSomething, 42, 42.42);
                        ^^^ specify T is an int

但是我们可以通过使用auto函数的返回类型来改善这一点。使用它将功能变成

template <typename Function, typename... Args>
auto GetRuntime(const std::string& name, const Function& function, Args&&... args)
{
    std::cout << name << " started..." << std::endl;
    auto start = std::chrono::high_resolution_clock::now();

    auto result = function(std::forward<Args>(args)...);

    auto stop = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(stop - start);
    std::cout << name << " complete - duration: " << duration.count() << " milliseconds." << std::endl;

    return result;
}

推荐阅读