[英]C++: Is it possible to get a std::string out of an object that overloads the << operator?
我有一个 object 可以使用std::cout << obj
打印到控制台,但我无法从中获得std::string
,因为它似乎没有实现类似.string()
方法。 我想我也许可以使用那个重载的运算符来获取所有内容的字符串表示,而不必每次我需要时都实现一个 function 来自己做,尽管在这个问题上一无所获让我认为这是不可能的.
使用std::ostringstream
。 它是一个写入字符串的 C++ stream 实现。
您可以使用std::ostringstream
。
std::ostringstream os;
os << obj;
std::string result = os.str();
有不同的方法,您可以根据std::ostringstream
手动实现它,或者您可以在boost::lexical_cast
中使用它的预打包版本。 对于更复杂的操作,您可以实现一个就地字符串构建器,就像我在此处作为答案提供的那样(这解决了构建通用字符串的更复杂问题,但如果您想检查它是一个简单的通用解决方案)。
似乎链接的问题已从 StackOverflow 中删除,因此我将提供基本骨架。 第一个想法是考虑我们要使用就地字符串构建器来使用什么,这基本上是避免使用创建不必要的对象:
void f( std::string const & x );
f( make_string() << "Hello " << name << ", your are " << age << " years old." );
为此, make_string()
必须提供一个 object,它能够利用不同类型的现有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
),因为您必须提供采用操纵器(函数指针)的额外重载。 这个实现还有其他一些小问题,大部分都可以通过添加额外的重载来解决,但是上面的基本实现对于大多数常规情况来说已经足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.