#pragma once #include namespace refl { template class sarray { protected: const T* m_ptr; int m_size; public: constexpr sarray() :m_ptr(nullptr), m_size(0) {} constexpr sarray(std::initializer_list list) : m_ptr(list.begin()), m_size(list.size()) {} template constexpr sarray(const std::array& arr):m_ptr(&arr[0]), m_size(arr.size()){} const T* get() const{ return m_ptr; } const T* at(int i) const { if (i < m_size) { return m_ptr + i; } return nullptr; } constexpr int size() const { return m_size; } constexpr const auto begin()const { return iterator{ m_ptr }; } constexpr const auto end() const { return iterator{ m_ptr + m_size}; } // Iterator class class iterator { private: const T* ptr; public: constexpr iterator(const T* p) : ptr(p) {} // Overload ++ to move to next element constexpr iterator& operator++() { ++ptr; return *this; } // Overload * to dereference iterator constexpr const T& operator*() const { return *ptr; } // Overload != to compare iterators constexpr bool operator!=(const iterator& other) const { return ptr != other.ptr; } }; }; }