向量应该是:
std::vector<_NetVar *> DataVec;
或高级指针
std::vector<std::shared_ptr<_NetVar> > DataVec;
这样您就可以存储子类的实例而不是slicing他们到基类。
在 GetData 上,您需要向上转换从向量中检索到的指针。
编辑:添加完整的工作代码
正在处理的示例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 上有一些虚拟方法(在这种情况下静态指针转换下面可能是一个动态指针转换)
与此相关,您可能想要验证 NetVar 的析构函数(而不仅仅是 _NetDev 的析构函数)正在被调用(在 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>
并将其推入向量中。
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;
}
这里,向量的内容是std::shared_ptr<_NetVar>
这就是我们得到的。该shared_ptr需要向上转换为正确类型的shared_ptr
现在有一个问题,您必须知道向上转换到的正确类型,否则是未定义的行为。如果你有虚拟方法,你可以使用dynamic_pointer_cast,然后执行null检查...但这有一些绩效处罚
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;
}
最后测试并打印结果。