Захотелось мне тут какта, надысь, инициализацию шаблонного массива сделать универсально, чтоб он и свой размер знал и элементы автоматом в себя рассовывал. Типа, чтоб можно было делать так
1 | 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:
06 | class initializer_list { |
14 | constexpr initializer_list(): FItems(0), FSize(0) { } |
16 | constexpr initializer_list( const T* AItems, size_t ASize) : FItems(AItems), FSize(ASize) {} |
18 | constexpr size_t size() const { return FSize; } |
20 | constexpr const T* begin() const { return FItems; } |
22 | constexpr const T* end() const { return begin() + size(); } |
Пропробовал, работает, с-ка, так как надо, теперь можно шаблонный массив и обьявлять и срауже инициализировать, например значения аналоговых кнопок в матрице от RobotDyn. Не знаю, наскока это всё законно и правильно, но Петрович поправит, еслишто. :)
Таперича придется делать: each, keys, pop, push, shift, splice, unshift, values
Таперича придется делать
Не, пока не понадобица - не придёца.
а мона пример использования?
Что-то я не догоняю, как запись
1
TArray<uint16_t> KeyArray { 100,200,300,400,500,600,700,800 };
раскрывается в использование класса initializer_list.
А в progmem засунуть мона?
а мона пример использования?
Что-то я не догоняю, как запись
1
TArray<uint16_t> KeyArray { 100,200,300,400,500,600,700,800 };
раскрывается в использование класса initializer_list.
Вот, но это не полный текст TArray<T>
01
template<typename T>
02
class
TArray {
03
protected
:
04
05
uint8_t FSize;
06
T* FItems;
07
08
public
:
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
}
А в progmem засунуть мона?
Нинаю. :)
Так далеко моё скудоумие не простираеца.
не понял, что помешало сразу написать вот такой конструктор. без всех этих ваших конст-экспрессионов ?
1
TArray (
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
}
или все дело в том. чтобы его инициализировать сразу на месте списком в фигурных скобках?
сорри, до меня медленно доходит...
Если б я хотел сделать копирующий конструктор, я б его сделал. Но мне же ить вотку со льдом подавай, надо же сразу и инициализировать в месте обьявления. захотелось чота :)