如何在重用 std::stringstream 变量时避免使用 std::stringstream.str() 和 std::stringstream.clear() ?
How to avoid use of std::stringstream.str() and std::stringstream.clear() while reusing std::stringstream variable?
我已经像这样超载了 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();
,显然是为了清空 stream 和 clear错误状态。这两个 std::stringstream
函数的重复调用让我觉得我做错了什么。
因此我主要需要帮助:
- 如何重用
std::stringstream
变量 'ss' 而无需一次又一次地调用 ss.str("");ss.clear();
或
- 使用 googletest 实施超载
operator<<
测试的最佳替代方法。
您不需要从字符串流中 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
}
我已经像这样超载了 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();
,显然是为了清空 stream 和 clear错误状态。这两个 std::stringstream
函数的重复调用让我觉得我做错了什么。
因此我主要需要帮助:
- 如何重用
std::stringstream
变量 'ss' 而无需一次又一次地调用ss.str("");ss.clear();
或 - 使用 googletest 实施超载
operator<<
测试的最佳替代方法。
您不需要从字符串流中 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
}