[英]Why does this RAII cout redirector not work:
我想使用這個答案中給出的方法: https://stackoverflow.com/a/5419388/2050788 ,但顯然我錯過了一些東西,因為 cout 最終沒有被重定向。 有人可以解釋我缺少什么嗎?
這是一個最小的可編譯示例:
#include <sstream>
#include <streambuf>
#include <iostream>
struct cout_redirect {
cout_redirect( std::streambuf * new_buffer )
: old( std::cout.rdbuf( new_buffer ) )
{ }
~cout_redirect( ) {
std::cout.rdbuf( old );
}
private:
std::streambuf * old;
};
void no_guard() {
std::cout << "No RAII" << std::endl;
std::stringstream buffer;
std::streambuf *old = std::cout.rdbuf(buffer.rdbuf());
std::cout << "Bla" << std::endl;
std::cout.rdbuf(old);
std::cout << "Text = " << buffer.str() << std::endl;
}
void with_guard()
{
std::cout << "Using RAII" << std::endl;
std::stringstream buffer;
cout_redirect(buffer.rdbuf());
std::cout << "Bla";
}
int main() {
no_guard();
with_guard();
}
輸出是:
No RAII
Text = Bla
Using RAII
Bla
No RAII 情況按預期工作。 在 RAII 的情況下,我希望沒有輸出,因為 cout 應該重定向到 stringstream 緩沖區。 我錯過了什么? (使用 gcc 7.3.1 使用g++ -Wall test.cpp
編譯)。
編輯:好吧,我真的很笨——但我足夠大,可以承認這一點,並留在這里提醒我我的錯誤。
我認為cout_redirect(buffer.rdbuf());
只是創建在刪除的臨時對象;
. 試試cout_redirect cr(buffer.rdbuf());
.
在實踐中,將這樣的東西包裝在宏中以自動生成唯一名稱是很好的。
cout_redirect(buffer.rdbuf());
構造一個臨時cout_redirect
對象,它重定向cout
,然后銷毀臨時對象,恢復cout
。
你的意思是cout_redirect guard(buffer.rdbuf());
反而?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.