This patch adds <experimental/tuple>. <experimental/tuple> contains tuple_size_v and apply(F&&, Tuple&&).
In order to implement apply the existing functionality of __invoke in <__functional_base> is used. In order for apply to be constexpr all of the existing __invoke overloads were marked as constexpr.
Because __invoke is used apply supports all function types specified in the INVOKE macro specification. This means apply has extended support for pointers to member functions and pointers to member objects. This extension is tested in libcxx/test/libcxx/experimental/utilities/tuple/tuple.apply/extended_types.pas.cpp.
I just added a new config macro: _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
Please use that instead.