#ifndef SPROUT_UTILITY_PACK_HPP #define SPROUT_UTILITY_PACK_HPP #include #include #include #include #include namespace sprout { // // tppack_at // namespace detail { template struct tppack_at_impl_1 : public sprout::detail::tppack_at_impl_1 {}; template struct tppack_at_impl_1<0, Head, Tail...> { public: typedef Head type; }; template struct tppack_at_impl : public sprout::detail::tppack_at_impl_1 { static_assert(I < sizeof...(Args), "I < sizeof...(Args)"); }; } // namespace detail template struct tppack_at : public sprout::detail::tppack_at_impl {}; // // tppack_c_at // template struct tppack_c_at : public sprout::tppack_at...>::type {}; // // fppack_at // namespace detail { template< std::size_t I, typename R, typename Head, typename... Tail, typename sprout::enabler_if::type = sprout::enabler > inline SPROUT_CONSTEXPR R fppack_at_impl(Head&& head, Tail&&...) { return sprout::forward(head); } template< std::size_t I, typename R, typename Head, typename... Tail, typename sprout::enabler_if::type = sprout::enabler > inline SPROUT_CONSTEXPR R fppack_at_impl(Head&&, Tail&&... tail) { return sprout::detail::fppack_at_impl(sprout::forward(tail)...); } } // namespace detail template inline SPROUT_CONSTEXPR typename sprout::tppack_at::type fppack_at(Args&&... args) { return sprout::detail::fppack_at_impl< I, typename sprout::tppack_at::type >(sprout::forward(args)...); } } // namespace sprout #endif // #ifndef SPROUT_UTILITY_PACK_HPP