我试图创建一个构造函数来从任何给它的istream加载资源.我似乎无法找出将istream参数传递给构造函数的最佳方法.
Loader::Loader(istream stream);
Run Code Online (Sandbox Code Playgroud)
由于对象切片,这个很糟糕,所以没有选择.
Loader::Loader(istream& stream);
Run Code Online (Sandbox Code Playgroud)
这就是我现在使用的,看起来还不错.它有一个重要的问题 - 你不能给它一个临时的,因为temporaries不能绑定到非const引用!例如,以下内容不起作用:
Container():
mLoader(ifstream("path/file.txt", ios::binary)
{
}
Run Code Online (Sandbox Code Playgroud)
这是一个限制,因为我现在被迫将ifstream存储为Container的成员变量,以延长其生命周期.
既然问题出现在非const引用中,那么就可以这样:
Loader::Loader(const istream& stream);
Run Code Online (Sandbox Code Playgroud)
但是因为.seek()等是非const的,所以这也不是一个选择......
那么,如何以一种简洁的方式解决这个问题呢?
如果你的编译器是c ++ 11或更高版本,你可以简单地提供一个构造函数的版本,它将istreamr作为r值引用:
void Loader::Loader(std::istream&& is)
快速举例:
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
struct Loader
{
Loader(std::istream& is)
{
read(is);
}
Loader(std::istream&& is)
{
read(is);
}
void read(std::istream& is)
{
is >> std::quoted(x);
is >> std::quoted(y);
}
std::string x, y;
};
std::ostream& operator<<(std::ostream& os, const Loader& l)
{
os << "x = " << l.x;
os << ", y = " << l.y;
return os;
}
auto main() -> int
{
using namespace std;
Loader l(istringstream(R"text("donkey" "horse")text"));
cout << l << endl;
istringstream not_temp(R"text("apple" "banana")text");
Loader l2(not_temp);
cout << l2 << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
预期产量:
x = donkey, y = horse
x = apple, y = banana
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
645 次 |
| 最近记录: |