Преобразование void * в std :: string - PullRequest
25 голосов
/ 19 июня 2010

После просмотра Интернета и возни с собой я не могу преобразовать цель 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);

Есть идеи?

РЕДАКТИРОВАТЬ: Спасибо за все ответы, мне просто нужно было привести void * к std :: string *.Дурак я.Большое спасибо, ребята!

Ответы [ 4 ]

21 голосов
/ 19 июня 2010

Вам просто нужно динамически распределить его (потому что он, вероятно, должен пережить область, в которой вы его используете), а затем привести его назад и вперед:

// 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;
7 голосов
/ 19 июня 2010

На основании вашего комментария «Я имел в виду преобразовать то, на что указывает пустота * (которая является строкой), в строку».1005 * Вы можете просто привести обратно к строке:

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

Обратите внимание, что вы должны убедиться, что ptr фактически указывает на std::string.Если вы ошиблись и это указывает на что-то еще, это приведет к неопределенному поведению.

5 голосов
/ 19 июня 2010

Если вы пытаетесь отформатировать адрес как текст, вы можете использовать stringstream:

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

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

Если это не то, что вас интересует, уточните свой вопрос.

1 голос
/ 19 июня 2010

Если void является const char *, то вы можете просто вызвать с ним конструктор std :: string, т.е.

const char* cakes = something;
std::string lols = std::string(cakes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...