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

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

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

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. Не знаю, наскока это всё законно и правильно, но Петрович поправит, еслишто. :) 

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

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

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

sadman41 пишет:

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

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

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

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

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

TArray<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 пишет:

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

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

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;
    
	}

 

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

Logik пишет:

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

Нинаю. :)   

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

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

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

 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];
} 

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

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

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

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