【发布时间】:2020-07-13 00:19:36
【问题描述】:
我有一个 Scanner 类来标记来自文件、cin 等的字符流。
class Scanner {
public:
Scanner(std::istream&& c) : input{std::move(c)} {}
private:
std::istream input;
};
此代码无法编译,因为std::istream 的移动构造函数受到保护。我可以使用对流的引用,但是,我不能保证有人没有在Scanner 类(下面的ss)之外玩我的流。
std::string code = "this is code";
std::stringstream ss{code};
Scanner scanner{ss};
有没有一种巧妙的方法来解决这个问题,还是人们只是使用std::istream& 并希望得到最好的结果?
【问题讨论】:
-
我认为没有任何理由获得流的所有权
-
好吧,你不能使用 std::istream&。该对象将无法生存。
-
如果你想移动流,那么移动流,而不是通过抽象基类的一些引用。您可以移动具体对象本身(在本例中为
std::istringsream)。但是试图移动一个抽象的基类引用是无稽之谈。这不是移动的工作原理。如果input是std::istringstream,并且参数是std::istringstream&& c,你的代码会更快乐。 -
是的,但我试图获得一个也适用于 std::ifstream、cin 等的扫描仪。如果我将输入更改为 std::istringstream,则不再适用。
-
@WhozCraig 但这不是他想要在这里实现的目标。
标签: c++ move fstream iostream istream