tuple (1456B)
1 // -*- c++ -*- 2 #pragma once 3 4 #include <type_traits> 5 #include <xutility> 6 #include <new> 7 8 // replace "tuple()" with "constexpr tuple()", but leave other tuple ctors... 9 // http://stackoverflow.com/a/21371401 10 #define __GET_MACRO(_0, _1, _2, _3, _4, NAME, ...) NAME 11 #define tuple(...) \ 12 __GET_MACRO(_0, ##__VA_ARGS__, tuple, tuple, tuple, tuple, constexpr tuple) \ 13 (__VA_ARGS__) 14 15 // remove explicit from direct ctor (this is not c++17 compatible, but the 16 // libc++ builds should catch this problem) 17 #pragma push_macro("explicit") 18 #define explicit _Pragma("pop_macro(\"explicit\")") 19 #pragma push_macro("explicit") 20 #define explicit explicit _Pragma("pop_macro(\"explicit\")") 21 #pragma push_macro("explicit") 22 #define explicit explicit _Pragma("pop_macro(\"explicit\")") 23 24 #include_next <tuple> 25 26 #undef tuple 27 #undef __GET_MACRO 28 29 namespace std 30 { 31 32 template <typename T> 33 inline constexpr size_t tuple_size_v = tuple_size<T>::value; 34 35 template <std::size_t I, typename T> 36 using tuple_element_t = typename tuple_element<I, T>::type; 37 38 39 namespace detail 40 { 41 template <typename T, typename Tuple, size_t... I> 42 constexpr T make_from_tuple_impl(Tuple&& t, index_sequence<I...>) 43 { return T(get<I>(std::forward<Tuple>(t))...); } 44 } 45 46 template <typename T, typename Tuple> 47 constexpr T make_from_tuple(Tuple&& t) 48 { 49 return detail::make_from_tuple_impl<T>( 50 forward<Tuple>(t), 51 make_index_sequence<tuple_size_v<decay_t<Tuple>>>{}); 52 } 53 }