繁体   English   中英

C++:我可以更改矢量类型吗?

[英]C++: Can I change a vector type?

假设我有以下代码:

typedef struct foo{
    int x;
}foo;

typedef struct bar{
    int y
}bar;

struct foobar{
    std::vector<foo> foo1;
    std::vector<bar> bar1;
};

有没有办法改变std::vector<bar> bar1; 进入std::vector<foo> bar1; 并擦除里面的任何数据?

如果是这样,这可以在 function 中完成吗? 是这样的吗?

replaceBar(&myOwnStruct);

我不太擅长矢量,所以解释为什么这是/不可能的会很好。 谢谢!

将变量的类型(这在 C++ 中是不可能的)从一种类型“更改”为另一种类型的方法是使用std::variant来指示它允许持有的可能类型(或者,使用std::any持有所有类型),例如:

std::variant<std::vector<bar>, std::vector<foo>> bar1;

然后,您可以让bar1持有std::vector<bar> ,然后在稍后重新分配它持有std::vector<foo>

struct foo{
    int x;
};

struct bar{
    int y;
};

struct foobar{
    std::vector<foo> foo1;
    std::variant<std::vector<bar>, std::vector<foo>> bar1;
};

void replaceBar(foobar *fb) {
    fb->bar1 = std::vector<foo>{};
}

foobar myOwnStruct;
foobar.bar1 = std::vector<bar>{};
replaceBar(&myOwnStruct);

可能性 1:如果 foo 和 bar 可以有一个公共基数 class。那么您可以让向量成为指向基数 class 的指针。然后您可以将指针重新指向不同的 object。但它会重新分配 memory。不完全是什么你自找的。
可能性 2:您可以宣布工会。 但请注意,向量的 memory 在堆上,因此它并没有真正实现您的目标,您必须小心析构函数。 如果它是固定大小的普通 object arrays,你可以做到。
可能性 3:这在游戏中可能对您有用。 不是直接存储一个向量,而是存储一个 flatbuffers 序列化的字节块。 您可以将不同的东西重写到这些字节中。 您将需要结构中的另一个变量来说明这些字节中的内容。 也许这个选项对你来说太遥远了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM