Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以通过同一个指针访问不同的模板类对象吗?_C++_Templates - Fatal编程技术网

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
)。