31

After perusing the web and messing around myself, I can't seem to convert a void*'s target (which is a string) to a std::string. I've tried using sprintf(buffer, "%p", *((int *)point)); as recommended by this page to get to a C string, but to no avail. And sadly, yes, I have to use a void*, as that's what SDL uses in their USEREVENT struct.

The code I'm using to fill the Userevent, for those interested, is:

std::string filename = "ResumeButton.png";
SDL_Event button_press;
button_press.type = BUTTON_PRESS;
button_press.user.data1 = &filename;
SDL_PushEvent(&button_press);

Any ideas?

EDIT: Thanks for all the responses, I just needed to cast the void* to a std::string*. Silly me. Thank you guys so much!

Lewis
  • 1,310
  • 1
  • 15
  • 28

4 Answers4

34

You just need to dynamically allocate it (because it probably needs to outlive the scope you're using it in), then cast it back and forth:

// Cast a dynamically allocated string to 'void*'.
void *vp = static_cast<void*>(new std::string("it's easy to break stuff like this!"));

// Then, in the function that's using the UserEvent:
// Cast it back to a string pointer.
std::string *sp = static_cast<std::string*>(vp);
// You could use 'sp' directly, or this, which does a copy.
std::string s = *sp;
// Don't forget to destroy the memory that you've allocated.
delete sp;
Stephen
  • 47,994
  • 7
  • 61
  • 70
  • Note that this answer has an edge over the other(s), since it prevents the pointer's target from going out of scope. Thanks again! – Lewis Jun 19 '10 at 20:45
12

Based on your comment "What I meant was to convert what the void* is pointing to (which is a string) into a string."

Assuming you have this:

std::string str = ...;
void *ptr = &str;

You can just cast back to the string:

std::string *pstr = static_cast<std::string *>(ptr);

Note that it is on you to verify that ptr actually points to a std::string. If you are mistaken and it points to something else, this will cause undefined behavior.

R Samuel Klatchko
  • 74,869
  • 16
  • 134
  • 187
5

If you trying to format the address as text you can use a stringstream:

std::stringstream strm;
strm << ptr;
std::string str = strm.str(); 

// str will now have something like "0x80004567"

If that's not what you are interested in, please clarify your question.

R Samuel Klatchko
  • 74,869
  • 16
  • 134
  • 187
  • Sorry, I wasn't clear at all. What I meant was to convert what the void* is pointing to (which is a string) into a string. – Lewis Jun 19 '10 at 19:54
0

If the void is a const char*, then you can just call the std::string constructor with it, i.e.

const char* cakes = something;
std::string lols = std::string(cakes);
Puppy
  • 144,682
  • 38
  • 256
  • 465