是否有将类转换为字符串的标准方法

Is there a standard way to convert a class to a string

本文关键字:字符串 标准 方法 转换 是否      更新时间:2023-10-16

在Java中,标准是定义方法toString()来返回类的字符串表示形式。除了超载operator<<之外,c++中还有这样的标准吗?我知道有std::to_string()方法来获得一个数字的字符串表示。c++标准是否谈到定义方法to_string()以服务于类的类似目的,或者是否存在c++程序员遵循的共同实践?

实现这类操作的标准方法是提供插入操作符,以便将对象插入到流中——流可以是任何类型的流,例如stringstream。

如果你愿意,你也可以提供一个转换为字符串的方法(对你的插入操作符很有用),并且,如果你发现转换是可以接受的,你可以提供一个'to string'操作符。

这是我的标准'point'类示例:

template <typename T>
struct point
{
  T x;
  T y;
  point(): x(), y() { }
  point( T x, T y ): x(x), y(y) { }
};
template <typename T>
std::ostream& operator << ( std::ostream& outs, const point <T> & p )
{
  return outs << "(" << p.x << "," << p.y << ")";
}

我还倾向于保留一个方便的函数来将内容转换为字符串:

template <typename T>
std::string to_string( const T& value )
{
  std::ostringstream ss;
  ss << value;
  return ss.str();
}

现在我可以很容易地使用它了:

int main()
{
  point p (2,-7);
  std::cout << "I have a point at " << p << ".n";
  my_fn_which_takes_a_string( to_string(p) );

你会发现Boost Lexical Cast库也是为这类事情设计的。

c++标准没有规定这样做的方法,但看起来有一个提议可能会引入这样一个选项通用to_string/to_wstring函数,在动机部分中说,也强调了当前正在采取的常见做法(我将在下面演示):

长期以来,c++程序员一直在寻找一种简单的方法将对象转换为其字符串表示形式。的典型答案这个问题是创建一个本地ostringstream,插入对象返回到流中,然后使用STR获取结果字符串成员函数。这个解决方案简单、安全、灵活而且可扩展的,虽然绝对太啰嗦了应该是一个函数调用。提供c++ 11(部分)以一组重载to_string/to_wstring形式的解决方案功能。不幸的是,这些仅限于内置的数字类型。也存在非标准的解决方案——最明显的Boost::lexical_cast,它提供对象和的双向转换.

本文提出了一个解决方案:

  • 泛化了现有的to_string/to_wstring函数,用于任何提供流输出操作符的类型和任何basic_string专业化,
  • 与这些功能保持一致并基本兼容,
  • 提供额外的格式化和连接功能,
  • 通过构建熟悉的ostringstream解决方案,在概念上很简单。

有STL和Herb Sutter的两篇旅行报告,我都没有看到这篇论文。因此,希望这将在kona发布后的邮件中讨论。

他们在提案中提到的第一种方法看起来就像这个答案中的例子:

class A {
public:
  int i;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
  return strm << "A(" << a.i << ")";
}

与类似于这里的例子的东西结合:

template <typename T>
std::string to_string(const T& value) {
  std::ostringstream os;
  os << value;
  return os.str();
}

我们可以找到一个boost::lexical_cast的例子,在问题启用类使用boost::lexical_cast。

似乎没有标准的方法。据我所知,c++标准不允许重载std::to_string函数。

我最终使用了以下两种解决方案之一:

解决方案# 1

代替toString()方法,你可以使用:

operator std::string() const {
    return "Object string.";
}

为了支持流,你可以添加这样的内容:

friend std::ostream & operator <<(std::ostream &out, const YourClass &obj) {
    return out << static_cast<std::string>(obj);
}

我希望<<操作符只是内联第一个操作符的转换。

解决方案# 2

或者你可以用其他方式,如果你认为经常在流style:

friend std::ostream & operator <<(std::ostream &out, const YourClass &obj) {
    out << "Object ";
    out << "string.";
    return out;
}

并在转换操作符内使用:

operator std::string() const {
    std::ostringstream out;
    out << *this;
    return out.str();
}

这两种方法都可以满足大多数情况。

c++标准是否提到为类定义to_string()方法来达到类似的目的?

或者c++程序员是否有一个共同的实践。

。然而,我怀疑每个项目都有类似的功能。名称和返回类型很可能取决于项目的编码准则。

在我的工作中,我们使用
virtual QString toString() const = 0;

在一个基类中。

你可以开始在你的项目中使用类似的东西。

virtual std::string toString() const = 0;