【问题标题】:Is there a standard way to convert a class to a string是否有将类转换为字符串的标准方法
【发布时间】:2015-10-26 23:39:00
【问题描述】:

在Java 中,标准是定义方法toString() 来返回一个类的字符串表示。除了重载operator<<,C++ 中有没有这样的标准?我知道有 std::to_string() 方法可以获取数字的字符串表示形式。 C++ 标准是否提到定义方法to_string() 以服务于类的类似目的,或者是否有 C++ 程序员遵循的常见做法?

【问题讨论】:

  • 似乎需要toString() 方法的结构会被那些不需要的结构压倒。只是我的意见。
  • 你希望这个'标准'方法的效果是什么?在 C++ 中,没有标准的方法来定义“转换为字符串”(这通常是不可能的),因此也没有标准的方法来请求这种转换。
  • 本题:“除了标准的方式,还有标准的方式吗?”
  • operator std::string() const;打我
  • 感谢大家的评论和见解。我不是在寻找这样的方法会做什么(如在返回的字符串中会做什么),但更重要的是,一个被商定的“通用”方法名称(因此是标准)。如果一个类编写者决定提供一个返回类的字符串表示的方法,至少在方法名称上有某种约定(可以是 to_string、toString 等)。我认为 to_string 将是一个不错的选择,因为 std 已经为原始整数类型提供了此类方法。

标签: c++ c++11


【解决方案1】:

做这种事情的标准方法是提供一个插入操作符,以便可以将对象插入到流中——可以是任何类型的流,例如字符串流。

如果您愿意,您还可以提供一个转换为字符串的方法(对您的插入运算符很有用),如果您发现转换可以接受,您可以提供一个“转字符串”运算符。

这是我的标准“点”类示例:

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 Library也是为这种事情而设计的。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    长期以来,C++ 程序员一直在寻找一种简单的方法 将对象转换为其字符串表示形式。 一个典型的答案 这个问题是创建一个本地ostringstream,插入对象 到流中,然后用 str 获取结果字符串 成员函数。该解决方案简单、安全、灵活、 可扩展,虽然对于某些东西来说绝对过于冗长 应该是单个函数调用。提供 C++11(部分) 一组重载的 to_string/to_wstring 形式的解决方案 职能。不幸的是,这些仅限于内置 数字类型。 也存在非标准解决方案——最明显的是 boost::lexical_cast,它提供了对象的双向转换和 字符串,但缺少任何格式控制

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

    • 将现有的 to_string/to_wstring 函数概括为任何提供流输出运算符的类型和任何 basic_string 专业化,
    • 与这些功能保持一致并且大部分兼容,
    • 提供额外的格式化和连接功能,
    • 基于熟悉的 ostringstream 解决方案,在概念上很简单。

    有两个旅行报告STL'sHerb Sutter's,我也没有看到其中提到的这篇论文。所以希望这会在它发布时包含在post-Kona 邮件中。

    他们在提案中提到的第一种方法类似于the example in this answer

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

    结合类似from here的例子:

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

    我们可以在问题Enabling Classes for Use with boost::lexical_cast中找到一个boost::lexical_cast的例子。

    【讨论】:

      【解决方案3】:

      看起来没有标准方法。据我了解C++ standard does not permit overloading of std::to_string function

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

      解决方案 #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);
      }
      

      我希望&lt;&lt; 运算符将内联来自第一个运算符的转换。

      解决方案 #2

      或者,如果您经常以流式思考,您可以采取其他方式:

      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();
      }
      

      无论哪种方式,这都能让您应对大多数情况。

      【讨论】:

        【解决方案4】:

        C++ 标准是否提到定义方法 to_string() 以服务于类的类似目的,

        没有。

        或者是否有 C++ 程序员遵循的常见做法。

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

        在我的工作中,我们使用

        virtual QString toString() const = 0;
        

        在我们的一个基类中。

        您可以开始为您的项目使用类似的东西。

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

        在您的基类中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-19
          • 2012-01-26
          • 2011-04-27
          • 2011-03-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多