namespacedetail{template<classF,classTuple,std::size_t...I>constexprdecltype(auto)apply_impl(F&&f,Tuple&&t,std::index_sequence<I...>){// This implementation is valid since C++20 (via P1065R2)// In C++17, a constexpr counterpart of std::invoke is actually needed herereturnstd::invoke(std::forward<F>(f),std::get<I>(std::forward<Tuple>(t))...);}}// namespace detailtemplate<classF,classTuple>constexprdecltype(auto)apply(F&&f,Tuple&&t){returndetail::apply_impl(std::forward<F>(f),std::forward<Tuple>(t),std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{});}