문제

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!

도움이 되었습니까?

해결책

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;

다른 팁

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.

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.

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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top