【发布时间】:2011-07-11 20:13:47
【问题描述】:
我有一个可以用std::cout << obj 打印到控制台的对象,但我无法从中得到std::string,因为它似乎没有实现类似.string() 的方法。我想我也许可以使用那个重载的运算符来获取所有内容的字符串表示,而不是每次需要时都必须自己实现一个函数来完成它,尽管在这个主题上一无所获让我认为这是不可能的.
【问题讨论】:
我有一个可以用std::cout << obj 打印到控制台的对象,但我无法从中得到std::string,因为它似乎没有实现类似.string() 的方法。我想我也许可以使用那个重载的运算符来获取所有内容的字符串表示,而不是每次需要时都必须自己实现一个函数来完成它,尽管在这个主题上一无所获让我认为这是不可能的.
【问题讨论】:
使用std::ostringstream。它是一个写入字符串的 C++ 流实现。
【讨论】:
您可以使用std::ostringstream。
std::ostringstream os;
os << obj;
std::string result = os.str();
【讨论】:
有不同的实现方式,您可以根据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();
}
};
这可以用最少的代码完成大部分的实现。它有一些缺点,例如它不采用 manipulators (make_string() << std::hex << 30),因为您必须提供额外的重载来采用操纵器(函数指针)。这个实现还有其他一些小问题,大部分都可以通过添加额外的重载来解决,但是上面的基本实现对于大多数常规情况来说已经足够了。
【讨论】: