Здравствуйте, niXman, Вы писали:
X>привет!
X>собственно сабж. наверняка кто-то писал нечто подобное, — поделитесь плиз X>т.е. нужно понимать, присутствует ли какой-то конкретный тип в тьюпле, и если присутствует — в какой позиции. ну и удаление по позиции.
X>спасибо.
собственно сабж. наверняка кто-то писал нечто подобное, — поделитесь плиз
т.е. нужно понимать, присутствует ли какой-то конкретный тип в тьюпле, и если присутствует — в какой позиции. ну и удаление по позиции.
спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>собственно сабж. наверняка кто-то писал нечто подобное, — поделитесь плиз X>т.е. нужно понимать, присутствует ли какой-то конкретный тип в тьюпле, и если присутствует — в какой позиции. ну и удаление по позиции.
X>спасибо.
Здравствуйте, niXman, Вы писали:
X>привет! X>собственно сабж. наверняка кто-то писал нечто подобное, — поделитесь плиз X>т.е. нужно понимать, присутствует ли какой-то конкретный тип в тьюпле, и если присутствует — в какой позиции. ну и удаление по позиции.
Здравствуйте, AeroSun, Вы писали:
AS>Можно объяснить как работает makeIndices? Пошаговая отладка ничего не прояснила.
#include <type_traits>
#include <utility>
#include <iostream>
using namespace std;
// формирование пачки индексов от 0 до Size-1, удовлетворяющих заданному предикату
/*
* шаблонная функция makeIndices параметризуется следующим:
* 1. size_t Size - количество генерируемых индексов без учета предиката
* 2. class Pred - тип предиката, в нашем случае это будет лямбда с constexpr operator(),
* способным принимать любую конкретную инстанцию std::integral_constant и возвращающую буль-результат
* 3. size_t idx - текущий индекс при рекурсии, он будет подвергаться проверкам и в случае успеха будет
* включен в результирующий набор индексов
* 4. size_t... pass - результирующий набор индексов, накапливается по мере рекурсии
*
* начальное значение параметра Size надо задавать явно
* Pred, idx, pass - выводятся автоматически,
* Pred - по переданному в функцию аргументу,
* idx по дефолтному значению становится нулем,
* pass остается пустым
*
* работает рекурсивно, на каждой итерации проверяет индекс по предикату и накапливает его в pass, останов рекурсии
* по превышению Size
*
* в результате работы получится объект типа integer_sequence<size_t, pass...>, на обратном ходе рекурсии он
* будет без изменений возвращяться выше
*
* https://en.cppreference.com/w/cpp/types/integral_constant
* https://en.cppreference.com/w/cpp/utility/integer_sequence
*
* в нагрузку - тут можно по лекции посмотреть
* https://www.youtube.com/results?search_query=c%2B%2B+%D0%BC%D0%B5%D1%82%D0%B0%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5
*/template <size_t Size, class Pred, size_t idx=0, size_t... pass>
auto makeIndices(const Pred &pred)
{
//проверка на выход текущего индекса idx за границу Sizeif constexpr(idx >= Size)
{
//если вышел - формируется результат в виде инстанции std::integer_sequence, заряженную накопленными индексами в passreturn integer_sequence<size_t, pass...>();
}
//иначе - делается вызов предиката, которому передается текущий рабочий индекс для проверкиelse if constexpr(pred(integral_constant<size_t, idx>()))
{
//если предикат вернул истину - делается следующая рекурсивная итерация для
//текущего индекса равного idx+1 и pass равного <pass..., I>, то есть текущий индекс добавляется к passreturn makeIndices<Size, Pred, idx+1, pass..., idx>(pred);
}
//иначе - делается следующая рекурсивная итерация для idx+1 и pass без измененй, то есть текущий индекс игнорируетсяelse
{
return makeIndices<Size, Pred, idx+1, pass...>(pred);
}
}
template <size_t... I>
void print(index_sequence<I...>)
{
cout<<"[";
size_t cnt = 0;
((cout<<(cnt++ ? ", " : "")<<I),...);
cout<<"]"<<endl;
}
int main()
{
//предикат для нечетных чиселauto oddPred = [](auto idx)
{
return !!(idx()%2);
};
//предикат для четных чиселauto evenPred = [](auto idx)
{
return !(idx()%2);
};
print(makeIndices<10>(oddPred));
print(makeIndices<10>(evenPred));
return 0;
}
Спасибо! Затупил просто, что pass может быть и пустой. Пытался понять что и каким образом там передаётся и как потом засунутые туда данные оттуда вырезаются без лишнего.