从现有 istream 或类本身创建的 istream 初始化成员 istream
Initialize member istream from either existing istream or from one created by class itself
我正在尝试弄清楚如何拥有一个表示传入istream
或类自己创建的单个成员变量。
我认为,如果我动态分配类创建的istream
,则使用指向istream
的指针可以工作;但是,问题是unique_ptr
将尝试释放非动态分配的内存。
以下是一些重现我遇到的问题的代码:
#include <iostream>
#include <fstream>
#include <memory>
#include <string>
class example {
public:
explicit example(std::istream& i)
: m_input(&i)
{}
explicit example(const std::string& path)
: m_input(new std::ifstream(path))
{}
private:
std::unique_ptr<std::istream> m_input;
};
int main() {
example e1(std::cin);
example e2("./test.txt");
}
e1
将尝试释放std::cin
,这会导致错误。我知道我可以使用多个成员,例如
#include <iostream>
#include <fstream>
#include <memory>
#include <string>
class example {
public:
explicit example(std::istream& i)
: m_i(),
m_input(&i)
{}
explicit example(const std::string& path)
: m_i(path),
m_input(&m_i)
{}
private:
std::ifstream m_i;
std::istream *m_input;
};
int main() {
example e1(std::cin);
example e2("./test.txt");
}
但我想知道是否有办法只用一个成员变量来做到这一点
我想你可以通过存储指向流的指针来扩展你的方法:
class X {
public:
explicit X(std::istream& stream)
: stream(&stream, [](std::istream* stream){})
{}
explicit X(const std::string& path)
: stream(new std::ifstream(path),
[](std::istream* stream) { delete stream; })
{}
private:
using StreamDeleter = std::function<void(std::istream* stream)>;
std::unique_ptr<std::istream, StreamDeleter> stream;
};
只需添加一个自定义删除器。在现有流的情况下,它什么也不做。相反,如果流是手动创建的,则会释放流。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 为什么istream不支持右值提取
- 将无符号char*转换为std::istream*C++
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 如何从uint8_t载体创建 istream?
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 创建要从现有 istream 读取的子流
- 我创建的c++istream对象和cin之间的区别在哪里,它在库中的可见位置在哪里
- 使用StgCreateStorageEx创建的IStream对象是否有数量限制?