, 나는이 stringstream
MessageBox
를 사용하여 stringstream
의 내용을 표시하는 조작기와 함께 사용했습니다 :
#include <windows.h>
#include <sstream>
#include <ostream>
std::ostream &MessageBox(std::ostream &s) {
std::ostringstream *st = dynamic_cast<std::ostringstream *>(&s);
if (NULL != st)
::MessageBox(NULL, st->str().c_str(), "", MB_OK);
return s;
}
이를 사용하려면, 구문은 상당한 양의 모습 cout
을 사용하는 것과 같지만 MessageBox
은 std::endl
을 대체합니다. 예 :
std::ostringstream stm;
stm << " blah blah blah. Value: " << 1213.1231 << MessageBox;
편집 : 대부분 fnieto 용입니다. 이 경우 실제 다운 브로크는 이입니다. 그 이유는 매우 간단하다 : 전형적인 삽입을 수신하고 ostream에 대한 참조를 반환
는
std::ostream &operator<<(std::ostream &os, T const &t) {
// code here to insert t into os, then return os;
}
이것은 원래 이제 stringstream 객체를 받아 자동 (안전하게) 간단한 ostream에 그것을 캐스트. 그 자체로는 괜찮지 만 대부분의 삽입 기와 조작기에서는 잘 작동합니다. 왜냐하면 그것들은 ostream
인터페이스와 만 상호 작용하기 때문입니다.
그러나이 조작자는 약간 다르다. str()
멤버를 사용한다. ostream
은 전혀 정의하지 않는다. str()
을 호출하여 해결하고 컴파일하려면 ostream &
을 으로 변환해야하므로 컴파일러는 우리가 실제로 작업하고있는 객체가 str()
멤버를 갖게된다는 것을 알고 있습니다.
다운 캐스트를 없애려면 실제로는 매개 변수를 으로 만드십시오. ,
// should be equivalent:
my_stream << x << MessageBox;
더 나쁜, 컴파일러의 오류 메시지가 아마도 사용자에 대해 뭔가 std::basic_ostream<char>::str()
말하려고합니다 :
my_stream << x;
my_stream << MessageBox;
하지만 체인에 시도하는 사람들은 실패 : 그건 우리가 사업자를 체인 않을만큼 작동합니다 이는 사용자의 코드에 전혀 언급되지 않았습니다. 더 나쁜 것은 대부분의 사람들은 체인을 연결하거나 동일한 결과를 내지 못하는 것에 익숙하기 때문에 코드가 때때로 제대로 작동하는 이유와 완전히 컴파일 할 수없는 오류 메시지와 함께 컴파일에 실패한 이유를 파악하는 데 시간이 걸릴 것입니다.
C++ 콘솔 앱이 있고 이것을 Windows 앱으로 바꾸려는 경우 걱정할 필요가 없습니다. –
'cout << ""Hello "<< user_name;"이라는 대화 상자는 몇 개나됩니까? –
@ 단 - 그것은 C++을 가르치는 사람에게 일하는 학교의 강사의 요청 이었지만 학생들이 promopt 명령에 액세스 할 수 없게하려는 것입니다. @Eric - just 1 – CheeseConQueso