gpt4 book ai didi

c++ - 在 std::vector 中模板化存储多个不同类型

转载 作者:行者123 更新时间:2023-11-30 01:53:39 25 4
gpt4 key购买 nike

谢谢大家的宝贵时间,我真的很感激。

需要使用模板化方式在 std::vector 中存储多个不同类型的变量。要使用以下函数,程序员必须知道他们存储变量的顺序以及存储的变量数量。

class _NetVar {};

创建一个子类来保存实际变量:

template <class VARTYPE> class NetVar : public _NetVar
{
private:
VARTYPE Var;
NetVar(VARTYPE Value)
{
Var = Value;
}
};

创建基类辅助类的 vector

std::vector<_NetVar> DataVec;

数据像这样放入 vector 中:

template <class DATATYPE> void AddData(DATATYPE AddData)
{
DataVec.push_back(NetVar<DATATYPE>(AddData));
}

数据在这里从 vector 中拉出,一个内部变量保存 vector 的当前位置,并在每次请求变量时递增:

template <class DATATYPE> DATATYPE GetData()
{
NetVar<DATATYPE> Temp = PacketData[VecPos];

return Temp.Var;
++VecPos;
}

前面的函数出问题了,可以将子类识别为基类,但是否可以将基类识别为它的子类之一?

下面是代码的使用方式:

AddData<int>(32);
AddData<bool>(true);
AddData<std::string>("Test");

auto Var1 = GetData<int>();
auto Var2 = GetData<bool>();
auto Var3 = GetData<std::string>();

调用 GetData 时抛出异常:

'initializing' : cannot convert from '_NetVar' to 'NetVar<DATATYPE>'

如果有人能帮我解决这个问题,我将不胜感激,再次感谢您的宝贵时间。

注意:需要避免使用 Boost 等外部库。

最佳答案

vector 应该是:

std::vector<_NetVar *> DataVec;

或高级指针

std::vector<std::shared_ptr<_NetVar> > DataVec;

这样你就可以存储子类的实例而不是 slicing他们到基类。

在 GetData 上,您需要向上转换从 vector 中检索到的指针。


编辑:添加完整的工作代码

处理 ideone 的示例, 不得不稍微调整一下权限。

并且该示例添加了一些注释。

#include <iostream>
#include <vector>
#include <memory>
class _NetVar {};

template <class VARTYPE>
class NetVar : public _NetVar
{
private:
VARTYPE Var;
public:
NetVar(VARTYPE Value)
{
Var = Value;
}
};

请注意,我将 NetVar<> 构造函数和 Var 属性更改为公开...需要 AddData 和 GetData 才能访问它。

不确定在您的示例中您是否在 _NetVar 上有一些虚拟方法(在这种情况下,下面的 static_pointer_cast 可能是 dynamic_pointer_cast )

与此相关,您可能想验证是否调用了 NetVar 的析构函数(不仅是 _NetVar 的析构函数)(在 ideone 上检查过,它们在我的示例中有效,因为我使用的是 std::make_shared<NetVar<XX> >(...) )

std::vector<std::shared_ptr<_NetVar> > DataVec;
int VecPos;

为下面的函数添加了这个全局变量。

template <class DATATYPE> void AddData(DATATYPE AddData)
{
DataVec.push_back(std::make_shared<NetVar<DATATYPE> >(AddData));
}

所以在这里我们创建一个 shared_ptr使用新对象 NetVar<DATATYPE>并将其插入 vector 中。

template <class DATATYPE> DATATYPE GetData()
{
std::shared_ptr<_NetVar> content = DataVec[VecPos];
std::shared_ptr<NetVar<DATATYPE> > Temp = std::static_pointer_cast<NetVar<DATATYPE> >(content);
++VecPos;

return Temp->Var;
}

这里 vector 的内容是std::shared_ptr<_NetVar>这就是我们得到的。该 shared_ptr 需要向上转换为正确类型的 shared_ptr

现在有一个问题,您必须知道要向上转换到的正确类型,否则就是未定义的行为。如果你有虚拟方法,你可以使用 dynamic_pointer_cast 然后执行 null 检查...但它有一些 performance penalties

int main() {

AddData<int>(32);
AddData<bool>(true);
AddData<std::string>("Test");

auto Var1 = GetData<int>();
auto Var2 = GetData<bool>();
auto Var3 = GetData<std::string>();

std::cout << Var1 << std::endl;
std::cout << Var2 << std::endl;
std::cout << Var3 << std::endl;
return 0;
}

最后测试并打印结果。

关于c++ - 在 std::vector 中模板化存储多个不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22999539/

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