Фрагмент кода, который я видел в Effective Modern С++, имеет умную реализацию обоснования инструментария, чтобы создать таймер функции:
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)(...
- По моему мнению, мы фактически отбрасываем функцию до ее первоначального типа, но зачем это нужно? Похоже, что простой вызов будет делать трюк.
- Есть ли другие случаи, когда мы используем совершенную переадресацию для вызова функции?
Это выглядит как хороший вариант использования использования знакомого синтаксиса шаблонов в лямбда-выражениях, если мы хотим сделать тип таймера постоянной времени компиляции.