我想在运行时定义的结构中创建一个结构,并在父结构的函数中引用这些变量。基本上,这是:

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

我知道那不是指针的作用,但是我没有更好的方法来描述我的期望。从对C++的有限理解中,我也意识到可能没有办法做我想做的事,但是最好的事情是什么?

最佳答案

有很多选择:

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>()) {}
};

二。 (有点Pythonic / javascripty。)使用 map 。这样,如果您知道struct的字段可以属于的所有可能类型的集合,它们实际上就是运行时。
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"]);
     }
};

三,如果可以,请将Foo模板化。
template<typename Struct> struct Foo {
     Struct generic_struct;
     Foo() { ++generic_struct.val; }
};

(添加一些SFINAE来编译所有结构访问。)

其他人可能甚至更复杂。

关于c++ - 在C++中创建 “generic”结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51594919/

10-11 22:40
查看更多