Информация об изменениях

Сообщение Re: поиск и удаление типа из tuple от 06.06.2018 11:24

Изменено 06.06.2018 11:30 rg45

Re: поиск и удаление типа из tuple
Здравствуйте, niXman, Вы писали:

X>привет!

X>собственно сабж. наверняка кто-то писал нечто подобное, — поделитесь плиз
X>т.е. нужно понимать, присутствует ли какой-то конкретный тип в тьюпле, и если присутствует — в какой позиции. ну и удаление по позиции.

Я бы делал как-то так:

https://ideone.com/DrVZF0

template <typename T, typename From, typename = From, typename = std::index_sequence<>>
struct RemoveFromHelper;

template <typename T, typename...E, typename Head, typename...Tail, size_t...I>
struct RemoveFromHelper<T, std::tuple<E...>, std::tuple<Head, Tail...>, std::index_sequence<I...>>
 : RemoveFromHelper<T, std::tuple<E...>, std::tuple<Tail...>, std::index_sequence<I..., sizeof...(E) - sizeof...(Tail) - 1>> {};

template <typename T, typename...E, typename...Tail, size_t...I>
struct RemoveFromHelper<T, std::tuple<E...>, std::tuple<T, Tail...>, std::index_sequence<I...>>
 : RemoveFromHelper<T, std::tuple<E...>, std::tuple<Tail...>, std::index_sequence<I...>> {};

template <typename T, typename...E, size_t...I>
struct RemoveFromHelper<T, std::tuple<E...>, std::tuple<>, std::index_sequence<I...>>
{
  using Indices = std::index_sequence<I...>;
  using Input = std::tuple<E...>;
  using Output = std::tuple<std::tuple_element_t<I, Input>...>;

  Output operator()(const Input& input) const { return Output(std::get<I>(input)...); }
};

template <typename T, typename From>
using RemoveFromOutput = typename RemoveFromHelper<T, From>::Output; 

template <typename T, typename...E>
RemoveFromOutput<T, std::tuple<E...>> remove_from(const std::tuple<E...>& t)
{
  return RemoveFromHelper<T, std::tuple<E...>>()(t);
}


Нетрудно видеть, что версия для rvalue параметра добавляется без труда.
Re: поиск и удаление типа из tuple
Здравствуйте, niXman, Вы писали:

X>привет!

X>собственно сабж. наверняка кто-то писал нечто подобное, — поделитесь плиз
X>т.е. нужно понимать, присутствует ли какой-то конкретный тип в тьюпле, и если присутствует — в какой позиции. ну и удаление по позиции.

Я бы делал как-то так:

https://ideone.com/DrVZF0

template <typename T, typename From, typename = From, typename = std::index_sequence<>>
struct RemoveFromHelper;

template <typename T, typename...E, typename Head, typename...Tail, size_t...I>
struct RemoveFromHelper<T, std::tuple<E...>, std::tuple<Head, Tail...>, std::index_sequence<I...>>
 : RemoveFromHelper<T, std::tuple<E...>, std::tuple<Tail...>, std::index_sequence<I..., sizeof...(E) - sizeof...(Tail) - 1>> {};

template <typename T, typename...E, typename...Tail, size_t...I>
struct RemoveFromHelper<T, std::tuple<E...>, std::tuple<T, Tail...>, std::index_sequence<I...>>
 : RemoveFromHelper<T, std::tuple<E...>, std::tuple<Tail...>, std::index_sequence<I...>> {};

template <typename T, typename...E, size_t...I>
struct RemoveFromHelper<T, std::tuple<E...>, std::tuple<>, std::index_sequence<I...>>
{
  using Input = std::tuple<E...>;
  using Output = std::tuple<std::tuple_element_t<I, Input>...>;

  Output operator()(const Input& input) const { return Output(std::get<I>(input)...); }
};

template <typename T, typename From>
using RemoveFromOutput = typename RemoveFromHelper<T, From>::Output; 

template <typename T, typename...E>
RemoveFromOutput<T, std::tuple<E...>> remove_from(const std::tuple<E...>& t)
{
  return RemoveFromHelper<T, std::tuple<E...>>()(t);
}


Нетрудно видеть, что версия для rvalue параметра добавляется без труда.