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