为什么这个 RAII cout 重定向器不起作用:
Why does this RAII cout redirector not work:
我想使用此答案中给出的方法:,但显然我遗漏了一些东西,因为 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());
吗?
我想使用此答案中给出的方法:,但显然我遗漏了一些东西,因为 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());
吗?