c++:是否有可能从重载<<的对象中获取std::string ?操作符

C++: Is it possible to get a std::string out of an object that overloads the << operator?

本文关键字:std 获取 string 操作符 对象 有可能 重载 是否 c++      更新时间:2023-10-16

我有一个可以用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中使用它的预打包版本。对于更复杂的操作,您可以实现一个原位字符串构建器,就像我在这里提供的答案一样(这解决了构建泛型字符串的更复杂的问题,但如果您想检查它是一个简单的泛型解决方案)。


似乎链接的问题已从StackOverflow中删除,所以我将提供基本的骨架。首先要考虑的是我们想要使用的就地字符串构造器,它基本上是避免使用create不必要的对象:

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),为此您必须提供额外的重载来接受操纵符(函数指针)。这个实现还有一些小问题,其中大部分可以通过添加额外的重载来解决,但是上面的基本实现对于大多数常规情况已经足够了。