Обобщите конструкцию самореферентной структуры, используя шаблон с переменным числом вариантов.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Обобщите конструкцию самореферентной структуры, используя шаблон с переменным числом вариантов.

Сообщение Anonymous »

У меня есть хитрый код, который мне нужен для инициализации множества объектов, ссылающихся друг на друга. Я хочу выделить и сконструировать их все одновременно, поэтому я помещаю их все в структуру.
Это выглядит так:

Код: Выделить всё

// User code
struct level1 {
explicit constexpr level1(int* ptr) : ptr{ptr} {}
int* ptr;
};

struct level2 {
constexpr level2(int* ptr_0, level1* ptr_1) : ptr_0{ptr_0}, ptr_1{ptr_1} {}
int* ptr_0;
level1* ptr_1;
};

struct level3 {
constexpr level3(int* ptr_0, level1* ptr_1, level2* ptr_2) : ptr_0{ptr_0}, ptr_1{ptr_1}, ptr_2{ptr_2} {}
int* ptr_0;
level1* ptr_1;
level2* ptr_2;
};

// Library side
struct self_referential {
explicit constexpr self_referential(int base_value) :
a{base_value},
b{&a},
c{&a, &b},
d{&a, &b, &c} {}

int a;
level1 b;
level2 c;
level3 d;
};

constexpr auto eval_result() -> int {
auto const s = self_referential{9};
return *s.d.ptr_2->ptr_1->ptr;
}

auto main() -> int {
return eval_result();
}
Этот код действителен и работает: https://godbolt.org/z/sMqofdshY
Теперь проблема в том, что я хочу сделать self_referential шаблоном с переменным числом вариантов. Есть ли способ сделать эту структуру универсальной? Я не могу изменить определение levelx, поскольку они являются пользовательскими, я хочу отправить levelx на самоссылку как шаблон с переменным числом вариантов.
Сначала я попробовал использовать кортеж:

Код: Выделить всё

template
struct self_referential {
explicit constexpr self_referential(Base b) :
values{b, std::get(values)...} {}

std::tuple values;
};
Я думаю, что здесь я своего рода нарушаю контракт std::get. Кроме того, мне понадобится целая куча пакетов.
Я пробовал использовать наследование, но опять без особого успеха:

Код: Выделить всё

template
struct self_referential : self_referential {
explicit constexpr self_referential(Base base) :
self_referential{&b}, b{base} {} // oh no

Base b;
};
Поначалу это выглядело просто, но потом я понял, что у меня нет ссылок на все остальные b в структуре. Кроме того, родители инициализируются перед дочерними классами, так что это тоже не сработает.
Есть ли более простой способ сделать это? Может быть, это что-то противоположное тому, что я делал с наследством?

Подробнее здесь: https://stackoverflow.com/questions/797 ... c-template
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»