5 Stimmen

Casting von string nach void* und zurück

Ist es möglich, STL-Klasse Objekt von void* umzuwandeln?

#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));
}

11voto

Fred Nurk Punkte 13458

Verwenden Sie static_cast, um void-Zeiger wieder in andere Zeiger zu konvertieren, achten Sie nur darauf, dass Sie genau denselben Typ wie ursprünglich verwenden. Für die Umwandlung in einen void-Zeiger ist kein cast erforderlich.

Dies funktioniert für jeden Zeigertyp, einschließlich Zeigern auf Typen aus der stdlib. (Technisch gesehen jeder Zeiger auf einen Objekttyp, aber das ist es, was mit "Zeigern" gemeint ist; andere Arten von Zeigern, wie z. B. Zeiger auf Datenelemente, erfordern eine Qualifizierung.)

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;
}

3voto

user963241 Punkte 6486

Ich habe wie folgt umformuliert,

#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
}

2voto

DReJ Punkte 1936

Ihr Code sollte sich nicht kompilieren lassen. ändern

std::string &s = reinterpret_cast<std::string&>(d);

zu

std::string *s = static_cast<std::string*>(d);

EDIT: Code aktualisiert. Verwenden Sie static_cast anstelle von reinterpret_cast

0voto

Marcelo Cantos Punkte 173498

Ja, das ist möglich, aber Sie versuchen, von einem Zeiger auf void * , dann zu einer Referenz . Die reinterpret_cast Operator erlaubt nur den Rückgriff auf genau denselben Typ, mit dem Sie begonnen haben. Versuchen Sie stattdessen dies:

void func(void *d)
{
    std::string &s = *reinterpret_cast<std::string*>(d);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X