c++ - 为任何其他任意函数计时并返回其结果的函数

标签 c++ templates generic-programming

我正在尝试编写一个函数,它接受任何其他任意函数作为输入并对其计时,然后返回该函数的结果。我已经用了几个小时了,我认为我已经很接近了,但我仍然不太清楚如何让它编译。<​​/p>

这是我目前所拥有的:

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

我的处理方式是否正确?如果是这样,我需要更改什么才能使其正常工作?如果不是,解决这个问题的更好方法是什么?

最佳答案

这里的问题是 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;
}

关于c++ - 为任何其他任意函数计时并返回其结果的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57479382/

相关文章:

c++ - 如何让两个模板类隐式转换为另一个

javascript - 登录时重新渲染模板

c++ - qsort 不适用于 C++ 中的哪些类型?

c++ - 传递通用函数以使用梯形规则进行数值积分

c# - 有人可以解释 <? super T> 意味着什么时候应该使用它,这个结构应该如何与 <T> 和 <?延伸 T>?

c# - 在 C# 中处理 C++ 结构

c++ - std::function/std::bind 的生命周期管理(在 Windows PostMessage 中传递一个仿函数作为 lparam)

c# - 在 C++ 和 C# ByRef 之间传递字节数组引发 AccessViolationException

django - 如何加密django模板中url中传递的参数

c++ - 元编程,试图避免许多特化