可以从void *?
重新映射STL类对象#include <string>
void func(void *d)
{
std::string &s = reinterpret_cast<std::string&>(d);
}
int main()
{
std::string s = "Hi";
func(reinterpret_cast<void*>(&s));
}
答案 0 :(得分:10)
使用static_cast将void指针转换回其他指针,只需确保转换回原来使用的完全相同的类型。转换为void指针不需要强制转换。
这适用于任何指针类型,包括指向stdlib中类型的指针。 (从技术上讲,任何指向对象类型的指针,但这都是“指针”的含义;其他类型的指针,例如指向数据成员的指针,需要进行限定。)
void func(void *d) {
std::string &s = *static_cast<std::string*>(d);
// It is more common to make s a pointer too, but I kept the reference
// that you have.
}
int main() {
std::string s = "Hi";
func(&s);
return 0;
}
答案 1 :(得分:3)
我重写如下,
#include<string>
void func(void *d)
{
std::string *x = static_cast<std::string*>(d);
/* since, d is pointer to address, it should be casted back to pointer
Note: no reinterpretation is required when casting from void* */
}
int main()
{
std::string s = "Hi";
func(&s); //implicit converssion, no cast required
}
答案 2 :(得分:1)
您的代码不应该编译。 变化
std::string &s = reinterpret_cast<std::string&>(d);
到
std::string *s = static_cast<std::string*>(d);
编辑:
更新的代码。使用static_cast
代替reinterpret_cast
答案 3 :(得分:0)
是的,这是可能的,但您尝试从指针转换为void *
,然后转换为引用。 reinterpret_cast
运算符只允许转换回与您开始时完全相同的类型。试试这个:
void func(void *d)
{
std::string &s = *reinterpret_cast<std::string*>(d);
}