我有一个可以使用std::cout << obj
打印到控制台的对象,但我无法从中获取std::string
,因为它似乎没有像{{{{{{ 1}}方法。我以为我可以使用那个重载的运算符来获取所有内容的字符串表示,而不是每次需要时都必须自己实现一个函数,尽管在这个主题上没有发现任何东西让我认为这是不可能的
答案 0 :(得分:10)
使用std::ostringstream
。它是一个C ++流实现,它写入一个字符串。
答案 1 :(得分:8)
您可以使用std::ostringstream
。
std::ostringstream os;
os << obj;
std::string result = os.str();
答案 2 :(得分:4)
有不同的方法,你可以用std::ostringstream
手动实现它,或者你可以在boost::lexical_cast
中使用它的预先包装版本。对于更复杂的操作,您可以实现一个就地字符串构建器,就像我提供的那样作为答案here(这解决了构建泛型字符串的更复杂问题,但是如果要检查它是一个简单的通用溶液)。
似乎链接的问题已从StackOverflow中删除,因此我将提供基本的骨架。第一个想法是考虑我们想要使用就地字符串构建器,这基本上避免了使用创建不必要的对象的需要:
void f( std::string const & x );
f( make_string() << "Hello " << name << ", your are " << age << " years old." );
为了实现这一目标,make_string()
必须提供一个能够利用现有operator<<
不同类型的对象。整个表达式必须可以转换为std::string
。基本实现相当简单:
class make_string {
std::ostringstream buffer;
public:
template <typename T>
make_string& operator<<( T const & obj ) {
buffer << obj;
return *this;
}
operator std::string() const {
return buffer.str();
}
};
这使用最少量的代码来处理大多数实现。它有一些缺点,例如它不需要操纵器(make_string() << std::hex << 30
),因为你必须提供带有操纵器(函数指针)的额外重载。这个实现还有其他小问题,其中大部分都可以通过添加额外的重载来克服,但上面的基本实现对于大多数常规情况来说已经足够了。