从字符串转换为void *并返回

时间:2011-01-26 12:14:12

标签: c++ casting

可以从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));
}

4 个答案:

答案 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);
}