【问题标题】:Struct containing references to self OR other struct type? [duplicate]包含对自身或其他结构类型的引用的结构? [复制]
【发布时间】:2019-05-20 10:46:02
【问题描述】:

我希望使用结构来创建一个数据类型,其中包含结构本身数组的其他引用或其他类型的结构。当引用是相同的泛型类型时,使用模板显然会导致类型本身的无限声明。我目前的解决方案是显式声明另一个结构类型和自身的结构类型。我想知道是否有更聪明的解决方案(使用结构)。

struct Transform
{
    float x;
    float y;
    float z;
    float qx;
    float qy;
    float qz;
    float qw;
};

struct Pattern
{
    enum type{ linear, rectangular, circular };
    char name[20];
    int id;
    Transform t[PATTERN_SIZE];
};

struct Group
{
    enum type{ pattern, group };
    char name[20;
    int id;
    Group *g[20];
    Pattern *p[20];
};

【问题讨论】:

  • 不,这不是那个问题的重复。我在问是否可以在 struct 中拥有一个变量,既可以是类型本身,也可以是类型模式。
  • 好的,你的问题措辞很奇怪。那么你正在寻找的是 std::variant (或者 boost::variant 或类似的,如果你使用的是旧编译器)。
  • 你的问题措辞很糟糕。你能解释一下你想解决什么问题吗?它看起来像张贴的XY problem
  • 工会是浪费的意思?如果代码路径需要 A 它必须为 A 留出空间,因此除非您的正常路径是 B 并且 B 明显更小,否则任何包含分配操作和/或指针的多态方案可能总体上更“浪费” ",尤其是当您确实需要 A 时。
  • @GemTaylor 你可能是对的。我想这是一种早期过度优化的情况,但我对 C++ 还不太熟悉,所以我想我只是想弄清楚该语言的可能性。无论如何,感谢cmets。附言为措辞不当的问题道歉:/

标签: c++ c++11 data-structures nested


【解决方案1】:

确实是 C-ish,但只要你只需要指针,void * 就是一个多用途指针:

struct Group
{
    enum type{ pattern, group } t;
    char name[20];
    int id;
    void *children[20];    // cast elements to `Group *` or `Pattern *` depending on t
};

【讨论】:

  • 不过,Group **/Pattern ** 的转换在形式上是未定义的。
  • @Quentin:是的,正确的方法是将单个数组元素分别转换为 Group *Pattern * 我懒得处理细节,因为它太 C-ish 我仅为了可能的解决方案的完整性而发布它。但你明白了;-)。我已经编辑了我的帖子。
  • C-ish 实际上对我来说是积极的,所以感谢您提供简单而有用的建议
  • 顺便说一句,如果您想要以 C 为中心的方法,您可以阅读Tagged Union 技术(std::variant 基本上实现了该技术)。
  • @DanM。谢谢大佬。
【解决方案2】:

如果你想要一个类型为 A 或 B(或 C...)的变量,你可以使用在 C++17 中引入的 std::variant 类型,或者如果你的编译器没有它的自定义实现不支持。 This 是它的外观。 对于简单的情况,您也可以使用联合手动执行此操作,但首选库解决方案。如果您想要专门的 union/struct-only 解决方案,我建议您将问题直接发送到 C 而不是 C++

但是,您似乎正在尝试创建某种树状结构。对于 C++ 中的此类结构,我发现简单继承效果最好。

【讨论】:

  • std::variant 是否允许不完整的类型?
  • 我刚查过,没有:\
  • @foreknownas_463035818 它允许指向不完整类型的指针,这就是问题所在。
  • @foreknownas_463035818 措辞不当。提供的示例使用指针并谈论结构引用本身,而不是使用文字 C++ 引用。例如,提供的 C++ 引用没有意义,因为您无法创建它们的数组。请参阅作者对其问题的评论:I am asking if it is possible to have a variable within the struct be of either type itself or type pattern.
  • 啊,抱歉,知道了;)。我之前没有仔细阅读 OPs 代码。我的评论仍然成立:您的问题没有提到您不能拥有不完整类型的 std::variant,但是您必须使用指针(然后我仍然很困惑首先使用 std::variant 的意义何在,但这可能只是我的困惑)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多