如何重写c++标准库类函数
How can I override an C++ standard-library class function?
如何重写c++标准库类函数?在我的应用程序中,我在代码的许多不同位置使用ofstream
对象。现在我想在Linux中以另一种权限模式打开文件,Ubuntu。但是ofstream
的open
函数没有参数来指定它创建的文件的权限模式。
现在我想重写ofstream
类的open()
函数,这样它就会得到一个参数来指定用户访问的权限。
对于初学者,为了澄清术语,STL通常指的是包含容器、迭代器和算法的c++标准库的子集。流类是c++标准库的一部分,但通常不与STL捆绑在一起。一些纯粹主义者会坚持认为c++标准库中没有STL这样的东西(因为从技术上讲,STL是标准中采用的第三方库),但大多数c++程序员会明白你的意思。
关于你的问题,在标准中没有办法用ofstream
来指定权限模式。如果你想创建自己的自定义流类,像ofstream
,但它支持权限,你最好的选择是这样做:
-
创建
basic_streambuf
的子类,允许您在指定Unix权限时打开,写入和可能读取文件。流类的设计使得与物理设备(如磁盘、网络和控制台)通信的细节都由basic_streambuf
类及其派生类处理。如果你想创建自己的流类,实现流缓冲区将是一个很好的第一步。 -
定义您自己的子类
basic_ostream
和安装您的自定义basic_streambuf
。默认情况下,basic_ostream
通过使用底层basic_streambuf
对象实现所有标准输出例程来支持它们。一旦你有了自己的流缓冲区,构建一个使用streambuf
的basic_ostream
类将导致该类(如<<
)上的所有标准流操作开始适当调用streambuf
。
如果你想了解更多细节,一个很好的参考是标准c++ IOStreams和locale。作为一个无耻的插件,我使用了本书中的技术来构建一个封装套接字连接的流类。虽然我的流中的许多代码不是特别有用,但基本结构应该可以帮助您入门。
希望这对你有帮助!
这不是直接回答你的问题,因为我不建议重写ofstream::open
。
你就不能使用这篇文章中的第一个建议吗?像往常一样打开文件以获得正确的权限,然后从文件描述符构造一个ofstream
。
#include <iostream>
#include <fstream>
class gstream: public std::ofstream
{
void open(const std::string& filename, ios_base::openmode mode,int stuff)
{
//put stuff here
}
};
int main() {
gstream test;
//io stuff
return 0;
}
另一个选择是创建一个包含'ofstream'对象并具有所需接口的包装器类,并将工作传递给它的'ofstream'成员。它看起来是这样的
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- 标准::变体的赋值运算符
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 并行标准::复制复杂性