Здравствуйте, 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;
}