如何将类指针转换为类似void *的泛型指针?这个代码是否有效?,
class CFoo
{
int a;
public:
CFoo():a(1){}
~CFoo(){}
getNum(){return a;}
};
void tfunc(void* data)
{
CFoo* foo = static_cast<CFoo*>(data);
std::cout << "Number: " << foo->getNum();
delete foo;
}
int main()
{
CFoo* foo = new CFoo;
void* dt = static_cast<void*>(foo);
tfunc(dt); // or tfunc(static_cast<void*>(food));
return 0;
}
答案 0 :(得分:11)
这完全有效。以下是标准的说法:
§4.10指针转换
2类型为“指向 cv
T
的指针的右值”,其中T
是一个对象 type,可以转换为“指向 cv 的指针”的右值void
。“将指向 cvT
”的指针转换为“指针” 到 cvvoid
“指向存储位置的开头 类型为T
的对象驻留,就好像该对象是派生最多的对象 类型T
的对象(1.8)(即,不是基类子对象)。
这意味着您可以将指向class的指针转换为void指针。而且......
§5.2.9静态演员
10可以明确指出“指向 cv
void
的指针”的右值 转换为指向对象类型的指针。类型指针的值 将对象转换为“指向 cvvoid
的指针”并返回到 原始指针类型将具有其原始值。
这意味着您可以使用static_cast
将void指针转换回原始类指针。
希望它有所帮助。祝你好运!
答案 1 :(得分:6)
在C ++中,您不需要静态强制转换来 void*
:
int main()
{
CFoo* foo = new CFoo;
void* dt = foo;
tfunc(dt); // or tfunc(foo);
return 0;
}
注意:tfunc()
的实施非常正确,因为 需要演员。
答案 2 :(得分:1)
这有效吗?
是的,它符合标准§5.2.9.7
类型为“指向cv1 void的指针”的prvalue可以转换为类型为“指向cv2 T的指针”的prvalue,其中T是对象类型,cv2与cv-qualification相同,或者cv-qualification等于,cv1。空指针值将转换为目标类型的空指针值。 指向对象的类型指针的值转换为“指向cv void的指针”并返回,可能具有不同的cv-qualification,应具有其原始值。 [示例:
T* p1 = new T;
const T* p2 = static_cast<const T*>(static_cast<void*>(p1));
bool b = p1 == p2; // b will have the value true.
答案 3 :(得分:0)
CFoo* foo = new CFoo;
void* dt = (void*)foo;