【问题标题】:Using streams to convert objects to strings使用流将对象转换为字符串
【发布时间】:2013-05-29 18:29:40
【问题描述】:

我有一个对象,它覆盖了流操作符

cout << obj << endl;

我想通过将字符串输出与预期字符串进行比较来在单元测试中测试此功能。我目前通过以下方式完成此操作:

stringStream ss;
ss << obj;
string objStr = ss.str();

EXPECT_EQ(objStr, "expected string output");

这不是特别可读,当然也不简洁。有没有更简单、更短、更简单的方法来获取 obj 的字符串表示形式?

【问题讨论】:

    标签: c++ unit-testing tdd stringstream


    【解决方案1】:

    您可以编写一个小型通用实用程序函数来为您做这件事:

    #include <utility>
    #include <string>
    #include <sstream>
    
    template<typename T>
    std::string make_string(T const& o)
    {
        std::stringstream ss;
        ss << o;
        return ss.str();
    }
    

    并以这种方式使用它:

    EXPECTED_EQ(make_string(obj), "expected string output");
    

    【讨论】:

    • 我的 c++ 不是很好。 ss.str()的结果是分配在make_string()的栈上还是分配在调用make_string()的函数的栈上?
    • 还有std:forward(o) 是必须的,你不能只做ss
    • @EthanHeilman: str() 按值返回std::string,您无需担心它的生命周期。在这种情况下std::forward&lt;T&gt;(o) 不是必需的,它只是完美转发的一种用法,在这种情况下 等效于ss &lt;&lt; o。我刚习惯写std::forward&lt;T&gt;。我会编辑答案
    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2011-08-02
    • 2016-06-10
    相关资源
    最近更新 更多