/*============================================================================= Copyright (c) 2011-2013 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #ifndef SPROUT_UTILITY_PACK_HPP #define SPROUT_UTILITY_PACK_HPP #include #include #include #include #include #include namespace sprout { // // pack_element // template struct pack_element : public std::tuple_element > {}; // // pack_element_c // template struct pack_element_c : public sprout::pack_element...>::type {}; // // pack_get // namespace detail { template< std::size_t I, typename R, typename Head, typename... Tail, typename sprout::enabler_if::type = sprout::enabler > inline SPROUT_CONSTEXPR R pack_get_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 pack_get_impl(Head&&, Tail&&... tail) { return sprout::detail::pack_get_impl(sprout::forward(tail)...); } } // namespace detail template inline SPROUT_CONSTEXPR typename sprout::pack_element::type pack_get(Args&&... args) { return sprout::detail::pack_get_impl< I, typename sprout::pack_element::type >(sprout::forward(args)...); } } // namespace sprout #endif // #ifndef SPROUT_UTILITY_PACK_HPP