【发布时间】:2020-10-09 09:44:01
【问题描述】:
我正在尝试通过getData() 成员函数访问NDArray 类的data_ 成员。
typedef void * datahandle_t;
enum class typeFlag {
kFloat32 = 0,
kFloat64 = 1,
kUint8 = 2
};
class NDArray{
private:
typeFlag dtype_;
size_t size_;
datahandle_t data_;
public:
// constructor
NDArray();
NDArray(const size_t size, typeFlag dtype);
// alloc TBlob object
void alloc();
const auto getData() const {if (data_) return data_->dptr_;}
// ...
}
inline NDArray::NDArray(): dtype_(typeFlag::kFloat32), size_(size), data_(nullptr) {}
inline NDArray::NDArray(const size_t size, typeFlag dtype): dtype_(dtype), size_(size) {alloc();}
inline void NDArray::alloc(){
switch(dtype_){
case typeFlag::kFloat32:
data_ = std::make_shared<TBlob<float> >(size_);
break;
case typeFlag::kFloat64:
data_ = std::make_shared<TBlob<double> >(size_);
break;
// ...
}
template<typename dtype>
class TBlob{
friend class NDArray;
public:
TBlob();
explicit TBlob(const size_t size);
~TBlob();
private:
size_t size_;
void *dptr_;
};
template<typename dtype>
inline TBlob<dtype>::TBlob(const size_t size): size_(size), dptr_(new dtype[size]) {}
测试代码:
#include <iostream>
NDArray n(18, typeFlag::kFloat32);
for(int i=0; i<18; i++) std::cout << int(n.getData()[i]) << " ";
首先我通过在构造函数中调用alloc() 来构造一个NDArray 对象。它会将不同的TBlob 对象分配给void * data_ 成员;
然后我希望我可以访问我制作的TBlob 对象,但我得到了错误:
testTBlob.cc:52:60: warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
for(int i=0; i<18; i++) std::cout << int(n.getData()[i]) << " ";
^
testTBlob.cc:52:60: error: ‘void*’ is not a pointer-to-object type
看来我还有一个void * 对象。
我想创建一个泛型类NDArray,而TBlob 是一个模板类,根据成员dtype_ 包含不同类型(float、int 等)。我想通过 data_ 成员访问 TBlob 对象,所以我希望它不是 void*,而是指向 TBlob 对象的智能指针。
如何访问已在内存中构造的特定对象(例如,TBlob<float> 对象)?
【问题讨论】:
-
你必须
reinterpret_cast你的void*指针指向一个特定的指针类型。但是在你的代码中有很多奇怪的行。例如。您将std::shared_ptr分配给void*,这甚至不应该编译。您尝试在您的数据上使用opertator[],即使您的TBlob类没有重载此运算符。您的示例包含许多不相关的代码,例如上下文、形状等。请改为发布 mcve。 -
顺便说一句,你为什么希望它不是一个 void*?
-
@pptaszni 我现在已经编辑好了,
operator[]是在内置数组上执行的。 -
@user253751 我想创建一个泛型类
NDArray,而TBlob是一个模板类,根据成员dtype_包含不同类型(float、int 等)。我想通过data_成员访问TBlob对象,所以我希望它不是void*,而是指向TBlob对象的智能指针。 -
嗯,
getData必须有一个返回类型,如果返回类型是 TBlob那么它就不能也是 TBlob 。除非您将 getData设为模板。你也可以让它返回 void* 并让调用者做演员。