fix pack_get order

This commit is contained in:
bolero-MURAKAMI 2013-11-30 13:16:30 +09:00
parent 37e5f52e4c
commit eb2918d065
2 changed files with 76 additions and 67 deletions

View file

@ -36,30 +36,44 @@ namespace sprout {
// pack_get
//
namespace detail {
template<
std::size_t I, typename R, typename Head, typename... Tail,
typename sprout::enabler_if<I == 0>::type = sprout::enabler
>
inline SPROUT_CONSTEXPR R
pack_get_impl(Head&& head, Tail&&...) {
return sprout::forward<Head>(head);
}
template<
std::size_t I, typename R, typename Head, typename... Tail,
typename sprout::enabler_if<I != 0>::type = sprout::enabler
>
inline SPROUT_CONSTEXPR R
pack_get_impl(Head&&, Tail&&... tail) {
return sprout::detail::pack_get_impl<I - 1, R>(sprout::forward<Tail>(tail)...);
}
// template<
// std::size_t I, typename R, typename Head, typename... Tail,
// typename sprout::enabler_if<I == 0>::type = sprout::enabler
// >
// inline SPROUT_CONSTEXPR R
// pack_get_impl(Head&& head, Tail&&...) {
// return sprout::forward<Head>(head);
// }
// template<
// std::size_t I, typename R, typename Head, typename... Tail,
// typename sprout::enabler_if<I != 0>::type = sprout::enabler
// >
// inline SPROUT_CONSTEXPR R
// pack_get_impl(Head&&, Tail&&... tail) {
// return sprout::detail::pack_get_impl<I - 1, R>(sprout::forward<Tail>(tail)...);
// }
template<typename Tup>
struct pack_get_helper;
template<typename... Args>
struct pack_get_helper<sprout::types::type_tuple<Args...> > {
template<typename T>
static SPROUT_CONSTEXPR T&&
eval(Args&&..., T&& t, ...) {
return sprout::forward<T>(t);
}
};
} // namespace detail
template<std::size_t I, typename... Args>
inline SPROUT_CONSTEXPR typename sprout::pack_element<I, Args&&...>::type
pack_get(Args&&... args) {
return sprout::detail::pack_get_impl<
I,
typename sprout::pack_element<I, Args&&...>::type
>(sprout::forward<Args>(args)...);
return sprout::detail::pack_get_helper<
typename sprout::types::detail::tuple_take<I, sprout::types::type_tuple<Args...> >::type
>::eval(sprout::forward<Args>(args)...);
// return sprout::detail::pack_get_impl<
// I,
// typename sprout::pack_element<I, Args&&...>::type
// >(sprout::forward<Args>(args)...);
}
} // namespace sprout