gpt4 book ai didi

C++ 将多种类型推送到 vector 上

转载 作者:IT老高 更新时间:2023-10-28 22:24:03 25 4
gpt4 key购买 nike

注意:我知道之前有人在 SO 上问过与此类似的问题,但我发现它们没有帮助或很清楚。

第二点:对于这个项目/任务的范围,我尽量避免使用第三方库,例如 Boost。

我正在尝试查看是否有一种方法可以让单个 vector 在其每个索引中保存多种类型。例如,假设我有以下代码示例:

vector<something magical to hold various types> vec;
int x = 3;
string hi = "Hello World";
MyStruct s = {3, "Hi", 4.01};

vec.push_back(x);
vec.push_back(hi);
vec.push_back(s);

我听说过 vector<void*>可以工作,但是内存分配会变得很棘手,如果插入某个索引的值比预期的大,附近内存中的某些部分总是有可能被无意覆盖。

在我的实际应用中,我知道哪些可能的类型可以插入到 vector 中,但是这些类型并不都派生自同一个父类(super class),也不能保证所有这些类型将被推到 vector 上或以什么顺序。

有没有一种方法可以安全地实现我在代码示例中展示的目标?

感谢您的宝贵时间。

最佳答案

std::vector<T> 持有的对象必须是同质类型。如果您需要将不同类型的对象放入一个 vector 中,您需要以某种方式删除它们的类型并使它们看起来都相似。您可以使用 boost::any 的道德等价物或 boost::variant<...> . boost::any 的想法就是封装一个类型层次结构,存储一个指向基类但指向模板化派生的指针。一个非常粗略和不完整的轮廓看起来像这样:

#include <algorithm>
#include <iostream>

class any
{
private:
struct base {
virtual ~base() {}
virtual base* clone() const = 0;
};
template <typename T>
struct data: base {
data(T const& value): value_(value) {}
base* clone() const { return new data<T>(*this); }
T value_;
};
base* ptr_;
public:
template <typename T> any(T const& value): ptr_(new data<T>(value)) {}
any(any const& other): ptr_(other.ptr_->clone()) {}
any& operator= (any const& other) {
any(other).swap(*this);
return *this;
}
~any() { delete this->ptr_; }
void swap(any& other) { std::swap(this->ptr_, other.ptr_); }

template <typename T>
T& get() {
return dynamic_cast<data<T>&>(*this->ptr_).value_;
}
};

int main()
{
any a0(17);
any a1(3.14);
try { a0.get<double>(); } catch (...) {}
a0 = a1;
std::cout << a0.get<double>() << "\n";
}

关于C++ 将多种类型推送到 vector 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13461869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com