C++ Academy
16.4K subscribers
639 photos
130 videos
1 file
596 links
По всем вопросам- @haarrp

@itchannels_telegram - 🔥 best it channels

РКН: clck.ru/3FmxJF
加入频道
🧠 Задача: Реализация `TypeList` с поддержкой операций на этапе компиляции

📌 Описание

Реализуйте шаблонный класс TypeList, который представляет собой список типов на этапе компиляции (compile-time type list). Он должен поддерживать следующие операции:

1. Получение длины списка (`length`)
2. Получение типа по индексу (`at<N>`)
3. Добавление типа в начало списка (`push_front<T>`)
4. Удаление первого типа (`pop_front`)
5. Проверка наличия типа в списке (`contains<T>`)
6. Фильтрация по условию (например, только целочисленные типы) (`filter<Predicate>`)

Всё это должно работать на этапе компиляции, без использования std::tuple или других runtime-контейнеров.

🧩 Пример использования


#include <type_traits>
#include <iostream>

// Пример предиката
template<typename T>
struct is_integral : std::is_integral<T> {};

int main() {
using MyList = TypeList<int, char, float, double, short>;

static_assert(MyList::length == 5);
static_assert(std::is_same_v<MyList::at<0>, int>);
static_assert(std::is_same_v<MyList::at<2>, float>);

using WithBool = MyList::push_front<bool>;
static_assert(WithBool::length == 6);
static_assert(std::is_same_v<WithBool::at<0>, bool>);

using Popped = WithBool::pop_front;
static_assert(std::is_same_v<Popped, MyList>);

static_assert(MyList::contains<int>);
static_assert(!MyList::contains<bool>);

using OnlyIntegral = MyList::filter<is_integral>;
static_assert(std::is_same_v<OnlyIntegral, TypeList<int, char, short>>);

return 0;
}


🛠 Требования к реализации
Используйте только возможности шаблонов и constexpr.
Не используйте std::tuple, std::array, if constexpr (если хотите усложнить — можно).
Предпочтительно использование C++17 или выше.
Код должен компилироваться и проходить все static_assert.

🧪 Бонусное задание
Реализуйте print_types() — функцию, которая выводит все типы из списка в std::cout (можно использовать typeid, PRETTY_FUNCTION или другие хаки).

@cpluspluc
8🔥4👍2