fork download
  1. #include <iostream>
  2. #include <tuple>
  3. #include <type_traits>
  4. #include <utility>
  5.  
  6. template <typename T, typename From, typename = From, typename = std::index_sequence<>>
  7. struct RemoveFromHelper;
  8.  
  9. template <typename T, typename...E, typename Head, typename...Tail, size_t...I>
  10. struct RemoveFromHelper<T, std::tuple<E...>, std::tuple<Head, Tail...>, std::index_sequence<I...>>
  11. : RemoveFromHelper<T, std::tuple<E...>, std::tuple<Tail...>, std::index_sequence<I..., sizeof...(E) - sizeof...(Tail) - 1>> {};
  12.  
  13. template <typename T, typename...E, typename...Tail, size_t...I>
  14. struct RemoveFromHelper<T, std::tuple<E...>, std::tuple<T, Tail...>, std::index_sequence<I...>>
  15. : RemoveFromHelper<T, std::tuple<E...>, std::tuple<Tail...>, std::index_sequence<I...>> {};
  16.  
  17. template <typename T, typename...E, size_t...I>
  18. struct RemoveFromHelper<T, std::tuple<E...>, std::tuple<>, std::index_sequence<I...>>
  19. {
  20. using Input = std::tuple<E...>;
  21. using Output = std::tuple<std::tuple_element_t<I, Input>...>;
  22.  
  23. Output operator()(const Input& input) const { return {std::get<I>(input)...}; }
  24. Output operator()(Input&& input) const { return {std::move(std::get<I>(input))...}; }
  25. };
  26.  
  27. template <typename T, typename From>
  28. using RemoveFromOutput = typename RemoveFromHelper<T, std::decay_t<From>>::Output;
  29.  
  30. template <typename T, typename From>
  31. RemoveFromOutput<T, From> remove_from(From&& t)
  32. {
  33. return RemoveFromHelper<T, std::decay_t<From>>()(std::forward<From>(t));
  34. }
  35.  
  36. /////////////////////////////////////////////////
  37. // A usage sample
  38.  
  39. template <typename...T, size_t...I>
  40. void print(const std::tuple<T...>& t, std::index_sequence<I...>)
  41. {
  42. char aux[]{ (std::cout << " " << std::get<I>(t), 0)...};
  43. std::cout << std::endl;
  44. }
  45.  
  46. template <typename...T>
  47. void print(const std::tuple<T...>& t)
  48. {
  49. print(t, std::make_index_sequence<sizeof...(T)>());
  50. }
  51.  
  52. int main()
  53. {
  54. print(remove_from<int>(std::make_tuple("one", 1, "two", 2, "three", 3, "fourty", 40)));
  55. }
Success #stdin #stdout 0s 4504KB
stdin
Standard input is empty
stdout
 one two three fourty