C++ 制作c+的最佳实践+;“类”;“可展示”;(字符串,ostream)

C++ 制作c+的最佳实践+;“类”;“可展示”;(字符串,ostream),c++,c++11,c++14,C++,C++11,C++14,我有一个值语义类,我希望它是“可显示”的,与haskellShow类的含义相同,或者Python提供了一个通用的\uu str\uu()函数 在c++中: 我可以超载操作员问题将在几分钟内被搁置,但我仍将在这里分享我的想法 首先,我们可以从列表中删除const char*/std::string()运算符重载。如果类不是字符串,则它不应转换为字符串,并且序列化启用不会使类成为字符串 至于str(),to_string和操作符我不知道这是否是最佳做法,但 对于调试,我总是定义operatorie

我有一个值语义类,我希望它是“可显示”的,与haskell
Show
类的含义相同,或者Python提供了一个通用的
\uu str\uu()
函数

在c++中:


  • 我可以超载
    操作员问题将在几分钟内被搁置,但我仍将在这里分享我的想法

    首先,我们可以从列表中删除const char*/std::string()运算符重载。如果类不是字符串,则它不应转换为字符串,并且序列化启用不会使类成为字符串


    至于
    str()
    to_string
    操作符我不知道这是否是最佳做法,但


  • 对于调试,我总是定义
    operatories,我担心这个问题太公开了,但我还是敢。您使用
    str()
    to_string()
    运算符的原因是什么?我猜您的意思是,优先于手动字符串连接之上的stringstream。在这种情况下,您可以选择
    operator@StijnFrishert确切地很难用简单的字符串连接来序列化复杂的类。值得一提的是,有时候打印对象的方法不止一种(调试信息、格式化输出等)。似乎是反对转换运算符的另一个论点(“那么,您想要什么输出格式?”。
    
    template<class T>
    struct make_writeable {
      friend std::ostream& operator<<(std::ostream& os, const T& t) {
        // example prefix...
        os << demangle(typeid(T).name()) << "{";
        t.write(os);
        // example postfix:
        os << " }";
        return os;
      }
    };
    
    struct X : make_writeable<X>
    {
      void write(std::ostream& os) const {
        // write out members here. they will appear within the prefix and postfix
      }
    };