Кудрявая инициализация шаблонов

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Захотелось мне тут какта, надысь, инициализацию шаблонного массива сделать универсально, чтоб он и свой размер знал и элементы автоматом в себя рассовывал. Типа, чтоб можно было делать так

1TArray<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:

 

Пропробовал, работает, с-ка, так как надо, теперь можно шаблонный массив и обьявлять и срауже инициализировать, например значения аналоговых кнопок в матрице от RobotDyn. Не знаю, наскока это всё законно и правильно, но Петрович поправит, еслишто. :) 

sadman41
Offline
Зарегистрирован: 19.10.2016

Таперича придется делать: eachkeyspoppushshiftspliceunshiftvalues

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

Таперича придется делать

Не, пока не понадобица - не придёца.

b707
Offline
Зарегистрирован: 26.05.2017

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

Что-то я не догоняю, как запись

1TArray<uint16_t> KeyArray { 100,200,300,400,500,600,700,800 };

раскрывается в использование класса initializer_list.

Logik
Offline
Зарегистрирован: 05.08.2014

А в progmem засунуть мона?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

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

Что-то я не догоняю, как запись

1TArray<uint16_t> KeyArray { 100,200,300,400,500,600,700,800 };

раскрывается в использование класса initializer_list.

Вот, но это не полный текст TArray<T>

01template<typename T>
02class TArray {
03protected:
04     
05    uint8_t FSize;
06    T*        FItems;
07 
08public:
09    TArray(const uint8_t ASize) {
10        FItems = new T[FSize = ASize];
11        for (uint8_t i = 0; i < FSize; ++i) FItems[i] = T();
12    }
13 
14    TArray(const std::initializer_list<T> &AList): TArray(AList.size()) {
15 
16    uint8_t idx = 0;
17        for (const auto& item:AList) FItems[idx++] = item;
18     
19    }

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Logik пишет:

А в progmem засунуть мона?

Нинаю. :)   

Так далеко моё скудоумие не простираеца. 

b707
Offline
Зарегистрирован: 26.05.2017

не понял, что помешало сразу написать вот такой конструктор. без всех этих ваших конст-экспрессионов ?

1TArray (const T* AItems, size_t ASize) : FSize(ASize) {
2                FItems = new T[FSize];
3                for (uint8_t i = 0; i < FSize; ++i) FItems[i] = AItems[i];
4}

или все дело в том. чтобы его инициализировать сразу на месте списком в фигурных скобках?

сорри, до меня медленно доходит...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Если б я хотел сделать копирующий конструктор, я б его сделал.  Но мне же ить вотку со льдом подавай, надо же сразу и инициализировать в месте обьявления.  захотелось чота :)