Infer return type with decltype()
use std::remove_cv and std::remove_reference to allow a Function returning a ReturnType const &