fork(3) 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 Output(std::get<I>(input)...); }
  24. };
  25.  
  26. template <typename T, typename From>
  27. using RemoveFromOutput = typename RemoveFromHelper<T, From>::Output;
  28.  
  29. template <typename T, typename...E>
  30. RemoveFromOutput<T, std::tuple<E...>> remove_from(const std::tuple<E...>& t)
  31. {
  32. return RemoveFromHelper<T, std::tuple<E...>>()(t);
  33. }
  34.  
  35. /////////////////////////////////////////////////
  36. // A usage sample
  37.  
  38. template <typename...T, size_t...I>
  39. void print(const std::tuple<T...>& t, std::index_sequence<I...>)
  40. {
  41. char aux[]{ (std::cout << " " << std::get<I>(t), 0)...};
  42. std::cout << std::endl;
  43. }
  44.  
  45. template <typename...T>
  46. void print(const std::tuple<T...>& t)
  47. {
  48. print(t, std::make_index_sequence<sizeof...(T)>());
  49. }
  50.  
  51. int main()
  52. {
  53. print(remove_from<int>(std::make_tuple("one", 1, "two", 2, "three", 3, "fourty", 40)));
  54. }
Success #stdin #stdout 0s 4512KB
stdin
Standard input is empty
stdout
 one two three fourty