我在Effective Modern C ++中看到的一个代码片段对仪表原理的巧妙实现实现了创建一个功能计时器:
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)(...
在我们希望使计时器类型成为编译时间常数的情况下,在lambda表达式中使用熟悉的模板语法似乎是一个很好的用例。
更好地描述std::forward<decltype(func)>(func)(...)
正在执行的操作将是保留传递给lambda的参数的值类别。
考虑以下具有ref限定operator()
重载的函子。
struct foo
{
void operator()() const &&
{ std::cout << __PRETTY_FUNCTION__ << '\n'; }
void operator()() const &
{ std::cout << __PRETTY_FUNCTION__ << '\n'; }
};
请记住,在lambda主体中func
是一个左值(因为它有一个名称)。如果没有forward
函数参数,&&
则永远不会调用限定的重载。而且,如果&
不存在限定的重载,那么即使调用者为您传递了一个右值foo
实例,您的代码也将无法编译。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句