@@ -1165,6 +1165,83 @@ namespace classdesc
11651165 std::cout<<msg<<std::endl;
11661166#endif
11671167 }
1168+
1169+ // tuple support
1170+ #if defined(__cplusplus) && __cplusplus>=201103L
1171+ template <class ... A> struct tn <std::tuple<A...>>
1172+ {
1173+ // TODO unpack argpack to explicitly name template parameters
1174+ static string name () {return " std::tuple<...>" ;}
1175+ };
1176+ #endif
1177+
1178+ #if defined(__cplusplus) && __cplusplus>=201703L
1179+
1180+ // The helper function that does the heavy lifting
1181+ template <typename Tuple, std::size_t ... Is>
1182+ auto tupleTailImpl (Tuple&& t, std::index_sequence<Is...>) {
1183+ // We add 1 to each index 'Is' to skip the first element (index 0)
1184+ return std::make_tuple (std::get<Is + 1 >(std::forward<Tuple>(t))...);
1185+ }
1186+
1187+ template <typename Tuple>
1188+ auto tupleTail (Tuple&& t) {
1189+ constexpr std::size_t N = std::tuple_size<std::decay_t <Tuple>>::value;
1190+
1191+ // Ensure the tuple isn't empty before trying to take the tail
1192+ static_assert (N > 0 , " Cannot take the tail of an empty tuple." );
1193+
1194+ if constexpr (N == 1 ) {
1195+ return std::make_tuple (); // Tail of a single-element tuple is empty
1196+ } else {
1197+ // Generate indices from 0 to N-2
1198+ return tupleTailImpl (std::forward<Tuple>(t),
1199+ std::make_index_sequence<N - 1 >{});
1200+ }
1201+ }
1202+ #endif
1203+
1204+ // #if defined(__cplusplus) && __cplusplus>=201103L
1205+ //
1206+ //
1207+ //
1208+ // template <template <class...> class T> struct Tuple1TailType;
1209+ // template <template <class...> class T, class A, class... B>
1210+ // struct Tuple1TailType<class T<A, B...>>
1211+ // {
1212+ // using type=T<B...>;
1213+ // };
1214+ //
1215+ // template <int N, class T> struct TupleTailType;
1216+ //
1217+ // template <class T>
1218+ // struct TupleTailType<1, T>
1219+ // {
1220+ // using type=typename Tuple1TailType<T>::type;
1221+ // };
1222+ //
1223+ // template <int N, template <class...> class T, class A, class... B>
1224+ // struct TupleTailType<N, T<A, B...>>
1225+ // {
1226+ // using type=typename TupleTailType<N-1, B...>::type;
1227+ // };
1228+ //
1229+ // template <class T, int N> struct TupleTail
1230+ // {
1231+ // typename TupleTailType<N, T>::type tuple;
1232+ // TupleTail(const T& x):
1233+ // tuple(std::tuple_cat(std::make_tuple(std::get<N>(x)), TupleTail<T,N+1>(x).tuple)) {}
1234+ // };
1235+ //
1236+ // template <class T> struct TupleTail<T, std::tuple_size<T>::value-1>
1237+ // {
1238+ // std::tuple<
1239+ // typename std::tuple_element<std::tuple_size<T>::value-1,T>::type> tuple;
1240+ // TupleTail(const T& x):
1241+ // tuple(std::get<std::tuple_size<T>::value-1>(x)) {}
1242+ // };
1243+ // #endif
1244+
11681245}
11691246
11701247
0 commit comments