我在 Effective Modern C ++ 中看到的代码片段巧妙地实现了instrumentation rationale以创建函数计时器:
auto timeFuncInvocation =
[](auto&& func, auto&&... params)
{
start timer;
std::forward<decltype(func)>(func)(
std::forward<decltype(params)>(params)...);
stop timer and record elapsed time;
};
我的问题是关于std::forward<decltype(func)>(func)(...
如果我们想让计时器类型成为编译时常量,这看起来像是the use of familiar template syntax in lambda expressions的一个很好的用例。
答案 0 :(得分:12)
更好地描述std::forward<decltype(func)>(func)(...)
正在做什么将保留传递给lambda的参数的值类别。
考虑以下具有ref-qualified operator()
重载的仿函数。
struct foo
{
void operator()() const &&
{ std::cout << __PRETTY_FUNCTION__ << '\n'; }
void operator()() const &
{ std::cout << __PRETTY_FUNCTION__ << '\n'; }
};
请记住,在lambda func
的主体内是左值(because it has a name)。如果您没有forward
函数参数,则永远不能调用&&
限定的重载。此外,如果没有&
限定的重载,那么即使调用者通过了右值foo
实例,您的代码也无法编译。