gpt4 book ai didi

C++:将 istream 和 ostream + 覆盖流运算符捆绑在一起

转载 作者:太空狗 更新时间:2023-10-29 23:14:47 27 4
gpt4 key购买 nike

我想创建一个管理 istream 和 ostream 的类 (IOObj)。我坚持的部分是如何正确覆盖流运算符,以便给定 IOObj io {}; , io << "blah" << std::endl使用 ostream 和 io >> x 输出使用 istream 输入到 x。我写的流操作符无法工作。 std::endl,可能还有大多数其他操纵器,都被简单地忽略了。

下面是我的尝试。

#ifndef IOOBJ_H_
#define IOOBJ_H_

#include <iostream>
#include "SimpleTextUIErrors.h"

namespace SimpleTextUI {

class IOObj: public std::iostream {
public:

IOObj(std::istream& in=std::cin, std::ostream& out=std::cout):
i{&in}, o{&out}, iOwner{false}, oOwner{false} {}
IOObj(std::istream& in, std::ostream* out): i{&in}, o{out}, iOwner{false}, oOwner{true} {}
IOObj(std::istream* in, std::ostream& out): i{in}, o{&out}, iOwner{true}, oOwner{false} {}
IOObj(std::istream* in, std::ostream* out): i{in}, o{out}, iOwner{true}, oOwner{true} {}

IOObj(const IOObj&)=delete;
IOObj& operator=(const IOObj&)=delete;

~IOObj() { releaseIO(); }

std::istream& in() { return *i; }
std::ostream& out() { return *o; }

void setInput(std::istream* in);
void setInput(std::istream& in);
void setOutput(std::ostream* out);
void setOutput(std::ostream& out);

void outputSeparator() { *o << "-------------------------------" << std::endl; }

protected:
IOObj(IOObj&&)=default;
IOObj& operator=(IOObj&&)=default;

private:
std::istream* i;
std::ostream* o;
bool iOwner, oOwner;

void releaseIO() {
releaseIn();
releaseOut();
}

void releaseIn() { if (iOwner) delete i; }
void releaseOut() { if (oOwner) delete o; }

};

template<typename T>
inline IOObj& operator<<(IOObj& io, T output) {
io.out() << output;
if (io.out().fail()) throw OutputFailedError{};
if (io.out().bad()) throw OutputBrokenError{};
return io;
}

template<typename T>
inline IOObj& operator>>(IOObj& io, T& input) {
io.in() >> input;
if (io.in().fail()) throw InputFailedError{};
if (io.in().bad()) throw InputBrokenError{};
return io;
}

} /* SimpleTextUI */

#endif /* IOOBJ_H_ */

最佳答案

诀窍是在操纵器的情况下也编写一个函数(比如 std::endl)。

我添加了以下代码:

inline IOObj& operator<<(IOObj& io, std::ostream& (*manip) (std::ostream&) ) {
io.out() << manip;
if (io.out().fail()) throw OutputFailedError{};
if (io.out().bad()) throw OutputBrokenError{};
return io;
}

不幸的是,这段代码与我代码中的<<模板函数完全一样,只是专门为流操纵器函数实例化。我无法解决这个问题(在下面发表评论,我会更新我的答案)。

此外,代码可能需要为 >> 运算符提供另一个这样的函数,但逻辑几乎相同。

关于C++:将 istream 和 ostream + 覆盖流运算符捆绑在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32088464/

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