Подтвердить что ты не робот

Преобразование 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 *. Дурак я. Спасибо, ребята, так много!

4b9b3361

Ответ 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);