c++ - 对任何其他任意函数计时并返回其结果的函数
问题描述
我正在尝试编写一个函数,该函数接受任何其他任意函数作为输入并对其计时,然后返回该函数的结果。我已经做了几个小时了,我觉得我已经很接近了,但我仍然不知道如何让它编译。
这是我到目前为止所拥有的:
// 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;
}
推荐阅读
- java - java - 如何使用Java获取JSON文件中多个对象的相同属性?
- javascript - 部分可见时滚动闪烁
- keycloak - Keycloak 在 Spring Boot 项目中无法处理根 URL
- gitlab - npm install 后 Gitlab Shared Runner docker build
- ssl - 在入口控制器为超集启用 SSL 终止
- azure-pipelines - 在 Azure 数据工厂中使用筛选器活动筛选数据的问题
- ruby-on-rails - 使用 pagey gem 时 #Array 的未定义方法“model_name”
- android - 初始化自定义接口侦听器以将数据从 Activity 传输到 Viewoager 片段
- python - 为什么我的循环更新循环外的变量?
- javascript - 另一个窗口的事件监听器