end concepts examples

This commit is contained in:
2025-09-05 18:29:24 +03:00
parent 5c46e0d889
commit c91e2c08d6
3 changed files with 167 additions and 232 deletions

View File

@@ -204,8 +204,12 @@ namespace hack::concepts::modern
// @brief Проверяет, является ли тип std::array
// @details Обнаруживает std::array с конкретным размером
// Полезно для алгоритмов, которые требуют знания размера на этапе компиляции
template<typename T, std::size_t N>
concept is_std_array = std::same_as<T, std::array<typename T::value_type, N>>;
template<typename T>
concept is_std_array = requires(T arr) {
requires std::same_as<T, std::array<typename T::value_type, std::tuple_size_v<T>>>;
arr.size();
arr[0];
};
// Универсальные концепты для категоризации
// @brief Проверяет, является ли тип любым контейнером
@@ -221,7 +225,7 @@ namespace hack::concepts::modern
is_unordered_associative_container<T> ||
is_container_adapter<T> ||
is_fixed_array<T> ||
is_std_array<T, std::tuple_size_v<T>>;
is_std_array<T>;
// @brief Проверяет, является ли тип итерируемым
// @details Обнаруживает любые типы, по которым можно итерироваться:
@@ -276,15 +280,7 @@ namespace hack::concepts::modern
template<typename T>
concept is_contiguous_container = std::same_as<T, std::vector<typename T::value_type, typename T::allocator_type>> ||
is_fixed_array<T> ||
is_std_array<T, std::tuple_size_v<T>>;
// Концепты для алгоритмов
// @brief Проверяет, поддерживает ли контейнер emplace-операцию
// @details Обнаруживает контейнеры, которые могут создавать элементы на месте:
// - vector::emplace_back(), map::emplace(), etc.
// Позволяет избежать лишних копирований и перемещений
template<typename Container, typename Value>
concept can_emplace = requires(Container c, Value&& v) { c.emplace(std::forward<Value>(v)); };
is_std_array<T>;
// @brief Проверяет, поддерживает ли контейнер добавление в начало
// @details Обнаруживает контейнеры с push_front():

View File

@@ -10,6 +10,10 @@
#include "hack/patterns/ring_buffer.hpp"
// HERE
// и нужно сделать реализацию где выводлится все в одной линии но при помощи цикла
// типа такого:
// for (auto i : range) hack::log(hack::log::line)(i);
namespace hack
{
class log