c++ - 如何在重用 std::stringstream 变量时避免使用 std::stringstream.str() 和 std::stringstream.clear() ?

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

我重载了 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<<像这样重载:

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();一次又一次或
  • 实现重载测试的最佳替代方案 operator<<使用 googletest

最佳答案

您也不需要从字符串流中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
}

关于c++ - 如何在重用 std::stringstream 变量时避免使用 std::stringstream.str() 和 std::stringstream.clear() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44663291/

相关文章:

c++ - map 中过期的 weak_ptr 会发生什么

c++ - 如何从字符串中解析 double?

c++ - 不能将 std::iota 与 std::set 一起使用

c++ - 从结构访问数据时,运算符重载去哪里了?

c++ - 指针运算符重载

c++ - 对 SPOJ 上的 POUR1 有什么建议?

c++ - <random> 的线程安全使用

c++ - 笛卡尔积指数生成器

c++ - C++ 中的 typedef 和运算符重载

c++ - 连续 for 循环不会终止 C++