C ++:是否有可能从一个重载<<的对象中获取一个std :: string运营商?

时间:2011-07-11 20:13:48

标签: c++ string stl

我有一个可以使用std::cout << obj打印到控制台的对象,但我无法从中获取std::string,因为它似乎没有像{{{{{{ 1}}方法。我以为我可以使用那个重载的运算符来获取所有内容的字符串表示,而不是每次需要时都必须自己实现一个函数,尽管在这个主题上没有发现任何东西让我认为这是不可能的

3 个答案:

答案 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),因为你必须提供带有操纵器(函数指针)的额外重载。这个实现还有其他小问题,其中大部分都可以通过添加额外的重载来克服,但上面的基本实现对于大多数常规情况来说已经足够了。