我正在尝试扩展此答案以返回函数的结果以及 CPU 时间。这是我的代码:
#include <chrono>
#include <iostream>
#include <utility>
template <typename F, typename... Args>
auto MeasureFunctionCpuTime(F func, Args&&... args) {
using TimeVar = std::chrono::high_resolution_clock::time_point;
constexpr auto get_now = std::chrono::high_resolution_clock::now;
TimeVar t1 = get_now();
const auto result = func(std::forward<Args>(args)...);
const double cpu_time =
std::chrono::duration_cast<std::chrono::nanoseconds>(get_now() - t1)
.count();
return {result, cpu_time};
}
double AddTwoNumbers(const double a, const double b) { return a + b; }
int main() {
auto [result, cpu_time] = MeasureFunctionCpuTime(AddTwoNumbers, 1.0, 3.0);
std::cout << result << "\n";
std::cout << cpu_time << "\n";
}
我使用以下命令行编译它:
g++ main.cpp -o main -std=c++17 -lstdc++ -o2
但我收到以下错误:
main.cpp: In instantiation of ‘auto MeasureFunctionCpuTime(F, Args&& ...) [with F = double (*)(double, double); Args = {double, double}]’:
main.cpp:20:75: required from here
main.cpp:14:27: error: returning initializer list
return {result, cpu_time};
^
main.cpp: In function ‘int main()’:
main.cpp:20:8: error: ‘void <structured bindings>’ has incomplete type
auto [result, cpu_time] = MeasureFunctionCpuTime(AddTwoNumbers, 1.0, 3.0);
^~~~~~~~~~~~~~~~~~
为什么这个初始化列表失败了?
更新: 按照Bob的提示,我设法通过将函数的返回值更改为这一行来返回一对:
return std::pair<decltype(result), double>{result, cpu_time};
这种方法有什么缺点吗?