C++ 我可以通过同一个指针访问不同的模板类对象吗?
我正试图通过C++ 我可以通过同一个指针访问不同的模板类对象吗?,c++,templates,C++,Templates,我正试图通过getData()member函数访问NDArray类的data成员 typedef void*datahandle\t; 枚举类类型标志{ kFloat32=0, kFloat64=1, kUint8=2 }; 班轮{ 私人: typeFlag-dtype; 大小\u t大小\u; 数据处理\u t数据\u; 公众: //建造师 NDArray(); NDArray(常量大小、类型标志和数据类型); //alloc-TBlob对象 void alloc(); const auto
getData()
member函数访问NDArray
类的data
成员
typedef void*datahandle\t;
枚举类类型标志{
kFloat32=0,
kFloat64=1,
kUint8=2
};
班轮{
私人:
typeFlag-dtype;
大小\u t大小\u;
数据处理\u t数据\u;
公众:
//建造师
NDArray();
NDArray(常量大小、类型标志和数据类型);
//alloc-TBlob对象
void alloc();
const auto getData()const{if(data_)返回数据->dptr_;}
// ...
}
内联NDArray::NDArray():dtype_u2;(typeFlag::kFloat32)、size_2;(size)、data_2;(nullptr){
内联NDArray::NDArray(const size_t size,typeFlag dtype):dtype_(dtype),size_(size){alloc();}
内联void NDArray::alloc(){
开关(数据类型){
案例类型标志::kFloat32:
数据=标准::使共享(大小);
打破
案例类型标志::kFloat64:
数据=标准::使共享(大小);
打破
// ...
}
模板
类TBlob{
朋友班;
公众:
TBlob();
显式TBlob(常量大小);
~TBlob();
私人:
大小\u t大小\u;
无效*dptr;
};
模板
内联TBlob::TBlob(常量大小):大小(大小),dptr(新数据类型[size]){
测试代码:
#包括
NDArray n(18,typeFlag::kFloat32);
对于(inti=0;i,您可以在C++17之后直接使用
如果你不能使用它或者只是想定义另一个指针类型,请参阅。你必须重新解释你的void*
指针指向特定的指针类型。但是在你的代码中有许多奇怪的行。例如,你将std::shared\u ptr
分配给void*
,这甚至不应该编译。你尝试使用operator[]
在您的数据上,即使您的TBlob
类没有重载此运算符。您的示例包含大量不相关的代码,如上下文、形状等。请改为发布。顺便问一下,为什么您希望它不是空的*?@pptaszni我现在已经编辑过了,运算符[]
在内置数组上执行。@user253751我想创建一个泛型类NDArray
,而TBlob
是一个包含不同类型(float、int等)的模板类根据成员dtype
。我想通过data
成员访问TBlob
对象,因此我希望它不是一个void*,而是指向TBlob
对象的智能指针。好吧,getData
必须有一个返回类型,如果返回类型是TBlob,那么它也不能是TBlob。除非您做出选择getData
一个模板。你也可以让它返回void*并让调用方进行转换。这就是我想要的!谢谢!注意,你仍然需要知道变量中的类型,以便使用它…@user253751显然std::variant
,不是吗?@RedFog我的意思是当你想访问变量中的向量时,你需要它要知道它是什么类型,或者使用模板生成所有案例。@user253751您可以(通过std::get
),但不需要(通过std::visit
)。