在 C++ 中创建 "generic" 个结构
create "generic" structures in c++
我想在运行时定义的结构中创建一个结构,其中包含我可以在父结构的函数中引用的变量。基本上,这个:
struct Bar
{
int val = 0;
}
struct Foo
{
struct *generic_struct;
Foo()
{
generic_struct = Bar;
generic_struct.val++;
}
}
int main()
{
Foo foo;
}
我知道这不是指针的作用,但我没有更好的方法来描述我的期望。我也从我对 C++ 的有限理解中意识到,可能没有办法做我想做的事,但最接近的事情是什么?
相当多的选择:
我。使用继承。
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。)使用地图。这样,只要您知道结构字段可以属于的所有可能类型的集合,它们就是真正的运行时。
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 以编译所有结构访问。)
其他的可能更复杂。
我想在运行时定义的结构中创建一个结构,其中包含我可以在父结构的函数中引用的变量。基本上,这个:
struct Bar
{
int val = 0;
}
struct Foo
{
struct *generic_struct;
Foo()
{
generic_struct = Bar;
generic_struct.val++;
}
}
int main()
{
Foo foo;
}
我知道这不是指针的作用,但我没有更好的方法来描述我的期望。我也从我对 C++ 的有限理解中意识到,可能没有办法做我想做的事,但最接近的事情是什么?
相当多的选择:
我。使用继承。
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。)使用地图。这样,只要您知道结构字段可以属于的所有可能类型的集合,它们就是真正的运行时。
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 以编译所有结构访问。)
其他的可能更复杂。