I think you should rewrite your function template using trailing-return-type as:
template<class Function, class... Args> inline auto apply(Function&& f, const Args&... args) -> decltype(f(args...)) { typedef decltype(f(args...)) ReturnType;
Note that if you pass args as Args&&... instead of const Args&.... then it is better to use std::forward in f as:
decltype(f(std::forward<Args>(args)...))
When you use const Args&... then std::forward doesn't make much sense (at least for me).
It is better to pass args as Args&&.. , called the universal link, and use std::forward with it.
Nawaz source share