【问题标题】:Using a mixin (?) to make stream i/o easier使用 mixin (?) 使流 i/o 更容易
【发布时间】:2011-10-12 15:16:11
【问题描述】:

由于与我一起处理通用代码的许多学生在理解正确的流运算符重载方面存在一些问题,因此我尝试创建一个帮助模板(不知道这是否是一个真正的 mixin)来简化代码并确保正确的运算符实现。来了:

template<typename T> struct IoEnabled {
  friend std::ostream& operator<<(std::ostream& out, T const& val) {
    return val.print(out);
  }

  friend std::istream& operator>>(std::istream& in, T& val) {
    return val.scan(in);
  }

  friend QTextStream& operator<<(QTextStream& out, T const& val) {
    return val.print(out);
  }

  friend QTextStream& operator>>(QTextStream& in, T& val) {
    return val.scan(in);
  }

  friend QDebug operator<<(QDebug dbg,T const& val){
    std::stringstream myStream;
    myStream << val;
    dbg.nospace() << myStream.str().c_str();
    return dbg;
  }
};

继承类:

class Foo: private IoEnabled<Foo> {
  protected:
   int mData;

  public:
    template<typename U>
    U& scan(U& in) {
      in >> mData;
      return in;
    }

    template<typename U>
    U& print(U& out) const {
      out << mData;
      return out;
    }
}

就我目前所见,此实现的缺点:

  • 不适用于第 3 方类型
  • 包括继承,因此与 IoClass 紧密耦合,尽管不是每个用户都可能需要 特定类型的 Io

上升:

  • 有效 ;-)
  • 无需修改所有类,也无需为每个类编写特定的新代码即可添加类似的流类

由于我在使用 mixin 方面不是很有经验,并且偶尔会违反编码准则,所以我想知道这是否是 mixin 的适当用法,或者如何获得类似的效果另一种更合适的技术。

非常感谢,马丁

【问题讨论】:

    标签: c++ templates generics mixins crtp


    【解决方案1】:

    如果他们可以编写scanprint 模板函数,他们还不如直接编写模板运算符,跳过这整个愚蠢的混入业务。

    struct Foo {
        int mData;
        Foo() : mData(mData) {}
    };
    
    template <typename OutputStream>
    OutputStream& operator<<(OutputStream& stream, const Foo& data) {
        stream << data.mData;
        return stream;
    }
    
    template <typename InputStream>
    InputStream& operator>>(InputStream& stream, Foo& data) {
        stream >> data.mData;
        return stream;
    }
    

    此外,特殊情况的 QDebug 重载看起来完全没有必要和错误。

    【讨论】:

    • 恕我直言:像你提议的完全模板化的流操作符会给你带来很大的麻烦,正如我前段时间被告知的那样,我也经历过stackoverflow.com/questions/4195764/…
    • Further QDebug 用于调试非常方便(没有 chache,红色,所有 QT DataTypes 都已经支持......)。不幸的是,它不能使用正常的语法重载。要按照 qt 框架中的建议编写“qDebug() doc.qt.nokia.com/latest/qdebug.html 中建议的方式进行。
    • 对于您的模板,您仍然需要调用访问者或让他们成为朋友。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2023-03-08
    • 2014-06-29
    • 2012-01-12
    • 2021-03-06
    相关资源
    最近更新 更多