Это выглядит так:
Код: Выделить всё
// 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();
}
Теперь проблема в том, что я хочу сделать self_referential шаблоном с переменным числом вариантов. Есть ли способ сделать эту структуру универсальной? Я не могу изменить определение levelx, поскольку они являются пользовательскими, я хочу отправить levelx на самоссылку как шаблон с переменным числом вариантов.
Сначала я попробовал использовать кортеж:
Код: Выделить всё
template
struct self_referential {
explicit constexpr self_referential(Base b) :
values{b, std::get(values)...} {}
std::tuple values;
};
Я пробовал использовать наследование, но опять без особого успеха:
Код: Выделить всё
template
struct self_referential : self_referential {
explicit constexpr self_referential(Base base) :
self_referential{&b}, b{base} {} // oh no
Base b;
};
Есть ли более простой способ сделать это? Может быть, это что-то противоположное тому, что я делал с наследством?
Подробнее здесь: https://stackoverflow.com/questions/797 ... c-template
Мобильная версия