Re: поиск и удаление типа из tuple
От: vopl Россия  
Дата: 25.05.18 12:34
Оценка: 23 (2) +2
Здравствуйте, niXman, Вы писали:

X>привет!


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

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

X>спасибо.


#include <tuple>
#include <type_traits>
#include <cassert>

/////////0/////////1/////////2/////////3/////////4/////////5/////////6/////////7
// если присутствует — в какой позиции
template <class T>
constexpr std::size_t pos(std::tuple<> * = nullptr)
{
    return 0;
}

template <class T, class Head, class... Tail>
constexpr std::size_t pos(std::tuple<Head, Tail...> * = nullptr)
{
    if constexpr(std::is_same_v<T, Head>)
    {
        return 0;
    }

    return pos<T, Tail...>()+1;
}

template <class T, class... Args>
constexpr std::size_t pos(const std::tuple<Args...> &)
{
    return pos<T, Args...>();
}

/////////0/////////1/////////2/////////3/////////4/////////5/////////6/////////7
// присутствует ли какой-то конкретный тип в тьюпле
template <class T, class... Args>
constexpr bool present(std::tuple<Args...> * v = nullptr)
{
    return sizeof...(Args) > pos<T, Args...>();
}

template <class T, class... Args>
constexpr bool present(const std::tuple<Args...> &)
{
    return present<T, Args...>();
}

/////////0/////////1/////////2/////////3/////////4/////////5/////////6/////////7
// ну и удаление по позиции
template <std::size_t I, class... Args>
constexpr bool del(const std::tuple<Args...> &v)
{
    return std::tuple_cat(left<I>(v), right<I+1>(v));//left, right - домашка, смотри тут http://rsdn.org/forum/cpp.applied/7087910
}

/////////0/////////1/////////2/////////3/////////4/////////5/////////6/////////7
int main()
{
    std::tuple<int, char, float> t;
    static_assert(0 == pos<int>(t));
    static_assert(1 == pos<char>(t));

    static_assert(true == present<int>(t));
    static_assert(true == present<char>(t));
    static_assert(false == present<short>(t));

    static_assert(std::is_same_v<std::tuple<char, float>, decltype(del<0>(t)));
    static_assert(std::is_same_v<std::tuple<int, float>, decltype(del<1>(t)));

    assert(std::make_tuple(220, '2', 0.5) == del<2>(std::make_tuple(220, '2', 0.5f, 0.5)));

    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.