gpt4 book ai didi

c++ - 自动换行 ostream

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:11 24 4
gpt4 key购买 nike

提前为糟糕的标题道歉,不确定如何称呼我正在尝试做的事情。

一些背景,懒得看的直接跳到下一段。我有一个单元测试类,我在其中调用带有某些条件的断言,如果它失败,我输出一些传入的字符串。我发现构建一个字符串发送给它是非常烦人的,例如我想说 “索引失败:” + i。我的想法是返回 std::ostream 而不是获取 std::string。如果断言失败,则返回 std::cerr,如果断言通过,则返回 std::stringstream。我想我可以很好地完成所有这些。我必须在我的单元测试类中存储一个 std::stringstream,这样我才能返回一个引用。

我想做的不是返回一个标准的 std::ostream 而是返回一个扩展的 std::ostream 输出 std::endl 当它完成时,我不必为每个断言记住它。具体的想法如下:

UnitTest("My test");
ut.assert(false) << "Hello world";
ut.assert(1 == 0) << "On the next line";

这个想法是,这个新类在销毁时会输出端线,并且一旦不再使用它就会被销毁(即不再有 << 运算符)。到目前为止,这就是我所拥有的(我已经删除了断言中的一些代码,它实际上在一个类中,但这足以说明发生了什么):

class newline_ostream : public std::ostream
{
public:
newline_ostream(std::ostream& other) : std::ostream(other.rdbuf()){}
~newline_ostream() { (*this) << std::endl; }
};

newline_ostream& assert(bool condition, std::string error)
{
if(!condition)
{
return newline_ostream(std::cerr);
}

return newline_ostream(std::stringstream());
}

当我尝试这种方法时,我得到一些信息,基本上告诉我返回我刚创建的对象是错误的,因为它不是左值。当我尝试将其更改为不返回引用时,它会提示没有复制构造函数(大概这是因为我正在扩展 std::ostream 而它没有复制构造函数)。

我正在寻找的是一些方法,它会导致编译器创建一个临时的 newline_ostream,assert() 将把它的结果写入其中,一旦它不再被使用(即没有更多 << 运算符)。这可能吗?如果可能的话如何?

最佳答案

复制 std::cerr 是不可能的(std::basic_ostream 的复制构造函数被删除)。因此,创建一个实现复制构造函数的派生类并不是真正的选择。

我建议您将 newline_ostream 创建为一个类,该类包含对 的引用(而不是派生自)std::ostream:

#include <iostream>

class newline_ostream
{
std::ostream &_strm;
public:

explicit newline_ostream(std::ostream &strm)
:_strm(strm)
{}

/* In the destructor, we submit a final 'endl'
before we die, as desired. */
virtual ~newline_ostream() {
_strm << std::endl;
}

template <typename T>
newline_ostream &operator<<(const T& t) {
_strm << t;
return *this;
}
};

int main()
{
newline_ostream s(std::cerr);
s << "This is a number " << 3 << '\n';

/* Here we make a copy (using the default copy
constructor of the new class), just to show
that it works. */
newline_ostream s2(s);
s2 << "This is another number: " << 12;

return 0;
}

关于c++ - 自动换行 ostream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13106692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com