在C++中创建“泛型”结构

q1qsirdb  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(97)

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

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

字符串
我知道这不是指针的作用,但我没有更好的方法来描述我所期望的。我也从我对C++有限的理解中认识到,可能没有办法做我想要的,但什么是最好的最接近的东西?

qltillow

qltillow1#

相当多的选择:
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.(有点像Python/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; }
};


(Add一些SFINAE来使所有的结构访问编译。)
其他人可能更复杂。

mi7gmzs6

mi7gmzs62#

如果我理解正确的话,您希望能够在运行时定义一个新的结构,其中的成员在编译时可能是未知的,并且仍然能够引用新创建的结构的成员和函数。最终用户可以在运行时创建新的自定义类,系统将允许他们像任何其他包含/编译的类一样使用。2而且,当时我用的是C#,不是C++。
我不得不学习创建该功能的系统非常复杂,而且我还没有使用C实现。在C#中,您将使用Reflection命名空间。C有一个名为运行时类型反射(RTTR)的开源库,它仍然被认为是“实验性的”,您可能希望研究一下。就像我说的,复杂,而且我真的不能声称自己对C库有任何了解。
如果这听起来像你正在寻找的,这里是到RTTR主页的链接:
Run Time Type Reflection Library Home Page的一个。
我相信这是一个独立的、不相关的解决方案,但在CppReference.com上有一个“Reflection Technical Specification”的文档,它“指定了对核心语言的修改,并为本页上列出的C
标准库定义了新组件”。因此,它似乎是标准库的扩展,而不是一个独立的库。
下面是一些示例Reflection TS: reflexpr keyword和扩展名Standard Library Reflection Extensions的定义。

相关问题