簡體   English   中英

為什么這個 RAII cout 重定向器不起作用:

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM