Кудрявая инициализация шаблонов
- Войдите на сайт для отправки комментариев
Захотелось мне тут какта, надысь, инициализацию шаблонного массива сделать универсально, чтоб он и свой размер знал и элементы автоматом в себя рассовывал. Типа, чтоб можно было делать так
TArray<uint16_t> KeyArray { 100,200,300,400,500,600,700,800 };
Нуачотакова, подумал я, за мной же стоит вся мощь и сила С++ стандарта 11, с его "curly brace iitialization", почему бы и не сделать через спицальную примочку std::initializer_list<T> . Пропробовал, о вот хрена лысого, в AVR версии GCC в пространстве std определен тока std::null_ptr и нихрена больше. А сделать то хочется... Пришлось протрезветь, наморщить мосх и всё-таки родить.
файл initlist.h:
#include <Arduino.h>
namespace std {
template<typename T>
class initializer_list {
protected:
const T *FItems;
size_t FSize;
public:
constexpr initializer_list(): FItems(0), FSize(0) { } // пустой конструктор
constexpr initializer_list(const T* AItems, size_t ASize) : FItems(AItems), FSize(ASize) {} //толстый конструктор
constexpr size_t size() const { return FSize; } // число элементов
constexpr const T* begin() const { return FItems; } // первый элемент
constexpr const T* end() const { return begin() + size(); } // конец+1
};
}
Пропробовал, работает, с-ка, так как надо, теперь можно шаблонный массив и обьявлять и срауже инициализировать, например значения аналоговых кнопок в матрице от RobotDyn. Не знаю, наскока это всё законно и правильно, но Петрович поправит, еслишто. :)
Таперича придется делать: each, keys, pop, push, shift, splice, unshift, values
Таперича придется делать
Не, пока не понадобица - не придёца.
а мона пример использования?
Что-то я не догоняю, как запись
TArray<uint16_t> KeyArray { 100,200,300,400,500,600,700,800 };раскрывается в использование класса initializer_list.
А в progmem засунуть мона?
а мона пример использования?
Что-то я не догоняю, как запись
TArray<uint16_t> KeyArray { 100,200,300,400,500,600,700,800 };раскрывается в использование класса initializer_list.
Вот, но это не полный текст TArray<T>
template<typename T> class TArray { protected: uint8_t FSize; T* FItems; public: TArray(const uint8_t ASize) { FItems = new T[FSize = ASize]; for (uint8_t i = 0; i < FSize; ++i) FItems[i] = T(); } TArray(const std::initializer_list<T> &AList): TArray(AList.size()) { uint8_t idx = 0; for (const auto& item:AList) FItems[idx++] = item; }А в progmem засунуть мона?
Нинаю. :)
Так далеко моё скудоумие не простираеца.
не понял, что помешало сразу написать вот такой конструктор. без всех этих ваших конст-экспрессионов ?
TArray (const T* AItems, size_t ASize) : FSize(ASize) { FItems = new T[FSize]; for (uint8_t i = 0; i < FSize; ++i) FItems[i] = AItems[i]; }или все дело в том. чтобы его инициализировать сразу на месте списком в фигурных скобках?
сорри, до меня медленно доходит...
Если б я хотел сделать копирующий конструктор, я б его сделал. Но мне же ить вотку со льдом подавай, надо же сразу и инициализировать в месте обьявления. захотелось чота :)