Я пытаюсь написать функцию, которая создает новую std::tuple
из существующей, пропуская элемент по заданному индексу. Например:
У меня есть кортеж t
, определенный следующим образом:
constexpr auto t = std::tuple(1, 2, 3, 4);
И я хочу скопировать его в другой кортеж. Однако я хочу пропустить элемент nth . Предположим, что в этом случае элемент nth , который я хочу пропустить, равен 3 (это означает, что я хочу пропустить элемент с индексом 2). Это приведет к новому кортежу, определенному как:
std::tuple(1, 2, 4);
Это самое близкое, что я получил до сих пор:
template<std::size_t N, typename T, std::size_t ... is>
constexpr auto fun(T&& tp, std::index_sequence<is...>&& i) noexcept {
return std::tuple((is != N ? std::get<is>(tp) : 0) ...);
}
template<std::size_t N, std::size_t... elems>
constexpr auto fun2() noexcept {
constexpr auto t = std::tuple(elems...);
return fun<N>(std::forward_as_tuple(elems...), std::make_index_sequence<sizeof...(elems)>());
}
Однако вместо удаления nth элемент, я устанавливаю его на 0.
В идеале, я бы изменил аргумент возврата в функции fun()
, чтобы создать новый кортеж, используя несколько временных кортежей:
return std::tuple_cat((is != N ? std::tuple(std::get<is>(tp)) : std::tuple()) ...);
Однако, проблема заключается в том, что у троичного оператора должны быть совпадающие типы с обеих сторон.
Еще один подход, который я попробовал, был основан на рекурсии:
template<std::size_t N, std::size_t head, std::size_t... tail>
constexpr auto fun3() noexcept {
if constexpr(!sizeof...(tail))
return std::tuple(head);
if constexpr(sizeof...(tail) - 1 == N)
return std::tuple_cat(fun3<N, tail...>());
if constexpr(sizeof...(tail) - 1 != N)
return std::tuple_cat(std::tuple(head), fun3<N, tail...>());
}
Однако это было еще более неудачным. В этом случае, если N
равно 0, элемент nth (который также является первым элементом здесь) будет по-прежнему использоваться в новом кортеже. Кроме того, это даже не скомпилируется, потому что есть проблема со вторым оператором:
if constexpr(sizeof...(tail) - 1 == N)
Что мне здесь не хватает? Как я могу скопировать кортеж и пропустить один из его элементов во время копирования?
Я использую C ++ 17, и мне нужно, чтобы функция была оценена во время компиляции.