return __result_type(std::forward<_Elements>(__args)...);
}
+ template<typename _Tp, bool = is_array<_Tp>::value>
+ struct __pa_add_rvalue_reference_helper
+ { typedef typename std::add_rvalue_reference<_Tp>::type __type; };
+
+ template<typename _Tp>
+ struct __pa_add_rvalue_reference_helper<_Tp, true>
+ { typedef _Tp& __type; };
+
+ template<typename _Tp>
+ struct __pa_add_rvalue_reference
+ : public __pa_add_rvalue_reference_helper<_Tp>
+ { };
+
+ template<typename... _Elements>
+ inline tuple<typename __pa_add_rvalue_reference<_Elements>::__type...>
+ pack_arguments(_Elements&&... __args)
+ {
+ typedef tuple<typename __pa_add_rvalue_reference<_Elements>::__type...>
+ __result_type;
+ return __result_type(std::forward<_Elements>(__args)...);
+ }
+
template<std::size_t...> struct __index_holder { };
template<std::size_t __i, typename _IdxHolder, typename... _Elements>
{
_Swallow_assign ignore;
}; // anonymous namespace
+
+ /**
+ * Stores a tuple of indices. Used by bind() to extract the elements
+ * in a tuple.
+ */
+ template<int... _Indexes>
+ struct _Index_tuple
+ {
+ typedef _Index_tuple<_Indexes..., sizeof...(_Indexes)> __next;
+ };
+
+ /// Builds an _Index_tuple<0, 1, 2, ..., _Num-1>.
+ template<std::size_t _Num>
+ struct _Build_index_tuple
+ {
+ typedef typename _Build_index_tuple<_Num-1>::__type::__next __type;
+ };
+
+ template<>
+ struct _Build_index_tuple<0>
+ {
+ typedef _Index_tuple<> __type;
+ };
+
+ // See stl_pair.h...
+ template<class _T1, class _T2>
+ template<typename _Tp, typename... _Args>
+ inline _Tp
+ pair<_T1, _T2>::
+ __cons(tuple<_Args...>&& __tuple)
+ {
+ typedef typename _Build_index_tuple<sizeof...(_Args)>::__type
+ _Indexes;
+ return __do_cons<_Tp>(std::move(__tuple), _Indexes());
+ }
+
+ template<class _T1, class _T2>
+ template<typename _Tp, typename... _Args, int... _Indexes>
+ inline _Tp
+ pair<_T1, _T2>::
+ __do_cons(tuple<_Args...>&& __tuple,
+ const _Index_tuple<_Indexes...>&)
+ { return _Tp(std::forward<_Args>(get<_Indexes>(__tuple))...); }
}
#endif // __GXX_EXPERIMENTAL_CXX0X__