web-dev-qa-db-ja.com

void *をstd :: stringに変換する

Webを熟読し、自分でいじり回した後、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 *にキャストする必要がありました。愚かな私。本当にありがとうございました!

26
Lewis

動的に割り当てる必要があります(おそらく、それを使用しているスコープよりも長く存続させる必要があるためです)。次に、前後にキャストします。

// 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;
22
Stephen

あなたのコメントに基づいて、「私が意味したのは、void *が指しているもの(文字列です)を文字列に変換することでした。」

あなたがこれを持っていると仮定します:

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

あなたは文字列にキャストバックすることができます:

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

ptrが実際にstd::stringを指していることを確認する必要があることに注意してください。誤って別のポイントを指している場合、これは未定義の動作を引き起こします。

7

アドレスをテキストとしてフォーマットする場合は、stringstreamを使用できます。

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

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

興味がない場合は、質問を明確にしてください。

5

Voidがconst char *の場合は、それを使用してstd :: stringコンストラクターを呼び出すことができます。

const char* cakes = something;
std::string lols = std::string(cakes);
1
Puppy