【问题标题】:How to avoid use of std::stringstream.str() and std::stringstream.clear() while reusing std::stringstream variable?如何在重用 std::stringstream 变量时避免使用 std::stringstream.str() 和 std::stringstream.clear() ?
【发布时间】:2017-06-20 21:27:24
【问题描述】:

我已经像这样重载了operator<<

std::ostream& operator<<(std::ostream& os, SomeClass C){ 
//SomeClass is the class to be represented with operator overloading
os << "{ ";
os << C.getPropertyA() << " ";
os << C.getPropertyB() << " }";
//getPropertyA(), getPropertyB():functions of 'SomeClass' that return std::string
return os;
}

现在我正在使用 googletest 来测试 operator&lt;&lt; 的重载,如下所示:

SomeClass C1;
SomeClass C2;
.
.
std::stringstream ss;
std::string str;

//First test
ss << C1;
std::getline(ss, str);
EXPECT_EQ("<some expected value>", str); // googletest test

//Second test
ss.str("");ss.clear(); //Mandatory if 'ss' need to be reused
ss << C2;
std::getline(ss, str);
EXPECT_EQ("<some expected value>", str); // googletest test
.
.
//Some more use 'ss' follows

现在的问题是每次我添加一个新测试我都需要在测试之前添加ss.str("");ss.clear();,显然是为了清空 streamclear 错误状态。重复调用两个std::stringstream 函数让我觉得我做错了什么。

因此我主要需要以下帮助:

  • 如何重用 std::stringstream 变量 'ss' 而无需一次又一次地调用 ss.str("");ss.clear();
  • 使用 googletest 对重载 operator&lt;&lt; 实施测试的最佳替代方案。

【问题讨论】:

  • 您不需要同时调用 str() 和 clear()。两个调用都做同样的事情。或者其他的就足够你想做的事情了。我不认为使用单独的 stringstream 变量会给您的代码带来任何可读性。使用 str("") 或 clear() (我个人的选择)使您的意图非常清晰,并且比从头开始创建新的字符串流更有效。
  • @MichaëlRoy Here 接受的答案说即使在调用 str("") 之后也需要调用 clear()。对我来说,只使用 str("") 工作正常。
  • @MichaëlRoy 也只使用clear() 是行不通的。

标签: c++ c++11 operator-overloading googletest stringstream


【解决方案1】:

您也不需要从字符串流中getline,因为您可以直接访问底层存储。更简单的方法是为每个测试创建新的stringstream

//First test
{
    SomeClass C1;
    .
    std::stringstream ss;
    ss << C1;
    EXPECT_EQ("<some expected value>", ss.str()); // googletest test
}

//Second test
{
    SomeClass C2;
    .
    std::stringstream ss;
    ss << C2;
    EXPECT_EQ("<some expected value>", ss.str()); // googletest test
}

【讨论】:

  • 感谢您指出对 getline() 的重复使用。我现在坚持@MichaëlRoy 的建议。
猜你喜欢
  • 2011-01-19
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多