gpt4 book ai didi

c++ - 使用混合(?)使流输入/输出更容易

转载 作者:太空狗 更新时间:2023-10-29 21:49:47 25 4
gpt4 key购买 nike

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

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

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

  • 不适用于第三方类型
  • 包括继承,因此与 IoClass 紧密耦合,但并非每个用户都需要某种类型的Io

上升:

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

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

非常感谢,马丁

最佳答案

如果他们可以编写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 重载看起来完全没有必要而且是错误的。

关于c++ - 使用混合(?)使流输入/输出更容易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7742337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com