initializer_list и неизвестная размерность
От: Bill Baklushi СССР  
Дата: 23.11.20 17:01
Оценка:
Приветствую.

По мотивам моего велосипеда https://rsdn.org/forum/cpp.applied/7854228.all
Автор: Свободу rg45!
Дата: 15.10.20


Там я применил инициализцию двумя параметрами-initializer_list — размерности и собственно данных.

Хочется инициализировать массив одним initializer_list, но рекурсивным. Например
multidim_dynarray arr{ {{ 1, 3 }, {2, 5 }},  {{ 4, 7 }, {6, 8 }} };

Тут синтаксис подкладывает свинью.

Вот это работает:
#include <iostream>
#include <initializer_list>

int main()
{
    auto v = { 1, 2, 3 };
    std::cout << typeid(v).name() << std::endl;
    return 0;
}

А если
auto v={ { 1, 3 }, {2} };

то уже не компилируется. Тип v автоматом не выводится, его нужно прописать явно
std::initializer_list<std::initializer_list<int>> v = { { 1, 3 }, {2} };


Это не страшно, но рекурсивный initializer_list тоже не работает.

Вот пример, для начала вычисляющий число измерений.
int func(int t)
{
    return 0;    
}

template <typename T> int func(std::initializer_list<T> t)
{
    return 1+func(*std::begin(t));
}


Обычный код не собирается
std::cout << func({ { 1, 3 }, {2} }) << std::endl;


Нужно
std::cout << func(std::initializer_list<std::initializer_list<int>> { { 1, 3 }, {2} }) << std::endl;

что неудобно.

Что-то можно сделать или в морг?

PS. Вроде видел какое-то решение на гитхабах, но найти не могу...
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.