struct — создать & quot; универсальный & quot; структуры в стеке переполнения

Я хочу создать структуру внутри структуры, которая определяется во время выполнения, с переменными, на которые я могу ссылаться в функциях родительской структуры. В основном это:

struct Bar
{
int val = 0;
}
struct Foo
{
struct *generic_struct;
Foo()
{
generic_struct = Bar;
generic_struct.val++;
}
}
int main()
{
Foo foo;
}

Я знаю, что это не то, что делают указатели, но у меня нет лучшего способа описать то, что я ожидаю. Я также из своего ограниченного понимания C ++ осознаю, что, вероятно, нет способа сделать то, что я хочу, но что будет лучшим из лучших?

0

Решение

Довольно много вариантов:

I. Используйте наследство.

struct Struct {
virtual Struct &setVal(int) = 0;
virtual ~Struct() {}
};
struct Bar: Struct {
int val = 0;
Struct &setVal(int that) { val = that; return *this; }х
};
struct Foo {
std::unique_ptr<Struct> str;
Foo(): str(std::make_unique<Bar>()) {}
};

II. (Несколько Pythonic / Javascripty.) Используйте карты. Таким образом, они действительно выполняются при условии, что вы знаете множество все возможное Поля структуры типов могут принадлежать.

template<typename... types> using Struct
= std::unordered_map<std::string, std::variant<types...>>;
auto bar() { return Struct<int, char, double>{{"val", 0}}; }

struct Foo {
Struct<int, char, double> generic_struct;
Foo(): generic_struct(bar()) {
++std::get<int>(generic_struct["val"]);
}
};

III. Делать Foo шаблонно, если можете.

template<typename Struct> struct Foo {
Struct generic_struct;
Foo() { ++generic_struct.val; }
};

(Добавьте немного SFINAE, чтобы все доступы к структуре компилировались.)

Другие, вероятно, еще сложнее.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]