Сообщение Re: поиск и удаление типа из tuple от 06.06.2018 11:24
Изменено 06.06.2018 16:44 rg45
Re: поиск и удаление типа из tuple
Здравствуйте, niXman, Вы писали:
X>привет!
X>собственно сабж. наверняка кто-то писал нечто подобное, — поделитесь плиз
X>т.е. нужно понимать, присутствует ли какой-то конкретный тип в тьюпле, и если присутствует — в какой позиции. ну и удаление по позиции.
Я бы делал как-то так:
https://ideone.com/hbLGBG
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
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));
}