Конструктор для вложенных списков инициализаторов
Возможно ли иметь универсальный конструктор, который принимает любой тип списка инициализатора, даже если в нем есть вложенные списки?
Скажем, у вас есть следующая частичная специализация шаблона для класса, который принимает в своем конструкторе вложенные списки инициализаторов:
шаблон класса ClassA;
template
class ClassA {
typedef std::initializer_list list_type;
typedef std::initializer_list llist_type;
typedef std::initializer_list lllist_type;
typedef std::initializer_list initializer_type;
size_t n_[4] = {0};
double* data_;
public:
ClassA(initializer_type l) {
assert(l.size() > 0);
assert(l.begin()->size() > 0);
assert(l.begin()->begin()->size() > 0);
assert(l.begin()->begin()->begin()->size() > 0);
size_t m = n_[0] = l.size();
size_t n = n_[1] = l.begin()->size();
size_t o = n_[2] = l.begin()->begin()->size();
n_[3] = l.begin()->begin()->begin()->size();
data_ = new double[m*n*o*n_[3]];
int i=0, j=0, k=0, p=0;
for (const auto& u : l) {
assert(u.size() == n_[1]);
for (const auto& v : u) {
assert(v.size() == n_[2]);
for (const auto& x : v) {
assert(x.size() == n_[3]);
for (const auto& y : x) {
data_[i + m*j + m*n*k + m*n*o*p] = y;
++p;
}
p = 0;
++k;
}
k = 0;
++j;
}
j = 0;
++i;
}
}
size_t size() const {
size_t n = 1;
for (size_t i=0; i