gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:55:57 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com