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 *にキャストする必要がありました。愚かな私。本当にありがとうございました!
動的に割り当てる必要があります(おそらく、それを使用しているスコープよりも長く存続させる必要があるためです)。次に、前後にキャストします。
// 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;
あなたのコメントに基づいて、「私が意味したのは、void *が指しているもの(文字列です)を文字列に変換することでした。」
あなたがこれを持っていると仮定します:
std::string str = ...;
void *ptr = &str;
あなたは文字列にキャストバックすることができます:
std::string *pstr = static_cast<std::string *>(ptr);
ptr
が実際にstd::string
を指していることを確認する必要があることに注意してください。誤って別のポイントを指している場合、これは未定義の動作を引き起こします。
アドレスをテキストとしてフォーマットする場合は、stringstream
を使用できます。
std::stringstream strm;
strm << ptr;
std::string str = strm.str();
// str will now have something like "0x80004567"
興味がない場合は、質問を明確にしてください。
Voidがconst char *の場合は、それを使用してstd :: stringコンストラクターを呼び出すことができます。
const char* cakes = something;
std::string lols = std::string(cakes);