我有一个具有唯一公共(public)数据成员的类,它是一个内置类型:
class foo {
public:
int data;
foo(int dataIn) : data(dataIn) {}
virtual ~foo() {}
// Some other class methods
protected:
// Some internal helper class methods
};
在另一个类中,我想使用memcpy
方法:
template<typename T>class bar {
protected:
T data;
public:
bar() {}
virtual ~bar() {}
void read(unsigned char* readBuff, const std::size_t &readSize) {
// Some stuff
std::memcpy(readBuff, &(this->data), readSize);
// Some stuff
}
};
当 T
是内置类型或 foo
的实例时,可以使用 bar
。
但是 T 是 foo
并且因此 bar
中的 data
是 foo
实例吗,我是否确保阅读来自 &(this->data)
指向的元素将是 foo
中的 data
?
当我运行这个时:
foo x(12);
std::cout << sizeof(foo);
我得到 4
,所以 foo 似乎正好是一个 int 的大小,所以我自然会认为即使不指定 也可以直接读取/写入
将写入数据。是真的吗?x
>x.data
我需要与 C++11 兼容。
最佳答案
没有。
对于有虚函数的类,编译器通常会在类的开头插入一些元数据。您不能假定实例的地址也是其第一个成员的地址。
您可以使用 if constexpr
来区分这两种情况:
if constexpr ( std::is_same_v<std::decay_t<T>, foo> ) {
std::memcpy(readBuff, &(this->data.data), readSize);
} else {
std::memcpy(readBuff, &(this->data), readSize);
}
关于c++ - 直接访问唯一的类数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49444591/