Фрагмент кода, который я видел в 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)(...
- Насколько я понимаю, мы на самом деле приводим функцию к ее исходному типу, но зачем это нужно? Похоже, что достаточно простого вызова трюк.
- Есть ли другие случаи, когда мы используем совершенную переадресацию для вызова функции?
Похоже, это хороший пример использования использования знакомого синтаксиса шаблона в лямбда-выражениях, если мы хотим сделать тип таймера - константа времени компиляции.
func
может иметь большой функциональный объект с неконстантным оператором(). Таким образом, вы избегаете бессмысленных копий и допускаете мутацию объекта функции. - person KABoissonneault   schedule 06.07.2015forward
. - person Kerrek SB   schedule 06.07.2015operator()
. - person Tavian Barnes   schedule 06.07.2015std::forward
нужен. - person Cameron   schedule 06.07.2015func
. Пожалуйста, игнорируйте :-) - person Cameron   schedule 06.07.2015