【发布时间】:2019-05-13 06:19:31
【问题描述】:
Scott Meyer 的《Effective Modern C++》一书中的第 24 项让我很兴奋。他提到了编写 C++14 lambda 来记录任意函数调用所用时间的可能性。
我仍处于学习 C++14 功能的早期阶段。我的尝试(Main.cpp)看起来像这样来测量成员函数调用的时间:
#include <chrono>
#include <iostream>
auto measure = [](auto&& function, auto&&... parameters) -> decltype(function)
{
const std::chrono::steady_clock::time_point startTimePoint =
std::chrono::steady_clock::now();
const auto returnValue = std::forward<decltype(function)>(function)(
std::forward<decltype(parameters)>(parameters)...);
const std::chrono::steady_clock::time_point stopTimePoint =
std::chrono::steady_clock::now();
const std::chrono::duration<double> timeSpan = std::chrono::duration_cast<
std::chrono::duration<double>>(stopTimePoint - startTimePoint);
std::cout << "Computation took " << timeSpan.count()
<< " seconds." << std::endl;
return returnValue;
};
class Test
{
public:
int computation(double dummy)
{
std::cout << "Received " << dummy << ". Computing..." << std::endl;
return 123;
}
};
int main(int, char**)
{
Test instance;
using Function = int (Test::*)(double);
Function function = instance.computation;
int result = measure(function, 1.0);
std::cout << "Result: " << result << std::endl;
return 0;
}
我收到以下编译错误:
..\src\Main.cpp: In function 'int main(int, char**)':
..\src\Main.cpp:43:36: error: cannot convert 'int (Test::*)(double)' to 'int' in initialization
int result = measure(function, 1.0);
^
..\src\Main.cpp: In instantiation of '<lambda(auto:1&&, auto:2&& ...)> [with auto:1 = int (Test::*&)(double); auto:2 = {double}; decltype (function) = int (Test::*&)(double)]':
..\src\Main.cpp:43:36: required from here
..\src\Main.cpp:9:69: error: must use '.*' or '->*' to call pointer-to-member function in 'std::forward<int (Test::*&)(double)>((* & function)) (...)', e.g. '(... ->* std::forward<int (Test::*&)(double)>((* & function))) (...)'
const auto returnValue = std::forward<decltype(function)>(function)(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
std::forward<decltype(parameters)>(parameters)...);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
显然我做错了,但我不知道如何做对。有谁能够帮我?非常感谢!
【问题讨论】:
-
你的 lambda 返回了错误的类型,查看std::result_of or std::invoke_result。您可能还想使用std::invoke。另请注意,时间测量具有一定的精度/开销(通常为数百纳秒),因此测量非常小的函数的运行时间可能无法提供相关数据。
-
你为什么想让
measure成为一个lambda? -
@DanielLangr 我尝试过类似
using ReturnType = std::result_of<function(parameters...)>::type;的操作,但我的编译器不接受它。你能给我另一个提示我使用std::result_of吗?谢谢! -
@n.m.如果它有效,它看起来很方便,我正在研究 C++11 和 C++14 的特性。