Преобразование void * в std::string
После просмотра веб-страницы и беспорядочного общения я не могу преобразовать цель void * (которая является строкой) в std::string. Я попытался использовать sprintf(buffer, "%p", *((int *)point));
в соответствии с рекомендацией этой страницы, чтобы перейти к строке C, но безрезультатно. И, к сожалению, да, я должен использовать void *, как то, что использует SDL в своей структуре USEREVENT.
Код, который я использую для заполнения Userevent, для заинтересованных:
std::string filename = "ResumeButton.png";
SDL_Event button_press;
button_press.type = BUTTON_PRESS;
button_press.user.data1 = &filename;
SDL_PushEvent(&button_press);
Любые идеи?
EDIT: Спасибо за все ответы, мне просто нужно было отличить void * от std::string *. Дурак я. Спасибо, ребята, так много!
Ответы
Ответ 1
Вам просто нужно динамически распределить его (потому что ему, вероятно, нужно пережить область действия, в которой вы его используете), а затем отбросить его туда и обратно:
// Cast a dynamically allocated string to 'void*'.
void *vp = static_cast<void*>(new std::string("it easy to break stuff like this!"));
// Then, in the function that 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;
Ответ 2
Основываясь на вашем комментарии "Я имел в виду преобразовать то, что указывает void * (которое является строкой) в строку".
Предполагая, что у вас есть это:
std::string str = ...;
void *ptr = &str;
Вы можете просто вернуться к строке:
std::string *pstr = static_cast<std::string *>(ptr);
Обратите внимание, что вам нужно проверить, что ptr
на самом деле указывает на std::string
. Если вы ошибаетесь, и это указывает на что-то еще, это приведет к поведению undefined.
Ответ 3
Если вы пытаетесь отформатировать адрес в виде текста, вы можете использовать stringstream
:
std::stringstream strm;
strm << ptr;
std::string str = strm.str();
// str will now have something like "0x80004567"
Если это не то, что вас интересует, уточните свой вопрос.
Ответ 4
Если void является const char *, вы можете просто вызвать конструктор std::string с ним, т.е.
const char* cakes = something;
std::string lols = std::string(cakes);