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

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

Изменено 06.06.2018 16:44 rg45

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

X>привет!

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

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

https://ideone.com/hbLGBG

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)...); }
  Output operator()(Input&& input) const { return Output(std::move(std::get<I>(input))...); }
};

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

template <typename T, typename From>
RemoveFromOutput<T, From> remove_from(From&& t)
{
  return RemoveFromHelper<T, std::decay_t<From>>()(std::forward<From>(t));
}
Re: поиск и удаление типа из tuple
Здравствуйте, niXman, Вы писали:

X>привет!

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

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

https://ideone.com/ORCJeo

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 {std::get<I>(input)...}; }
  Output operator()(Input&& input) const { return {std::move(std::get<I>(input))...}; }
};

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

template <typename T, typename From>
RemoveFromOutput<T, From> remove_from(From&& t)
{
  return RemoveFromHelper<T, std::decay_t<From>>()(std::forward<From>(t));
}