我很困惑。
我正在学习ofstream,似乎它实际上是一个basic_ofstream,如下所示:
一个名为basic_ofstream的类有一个名为ofstream的构造函数,其原因是什么?“基本”意味着有一个非基本版本。为什么构造函数名与类名不同?
发布于 2018-08-24 15:40:54
没有名为ofstream的构造函数(构造函数没有名称),也没有名为basic_ofstream的类(尽管微软文档声称)。
basic_ofstream是一个类模板(与类不同),ofstream是一个typedef名称a.k.a。键入别名,它引用该模板的一个实例化,特别是basic_ofstream<char>。
wofstream是另一个这样的名称,指的是basic_ofstream<wchar_t>。
这是C++标准库用于定义不同字符类型的不同类型的命名约定。遵循这一约定的另一组名称是basic_string、string和wstring。
发布于 2018-08-24 15:44:49
这不是不同名称的构造函数。这是一种专业化。所以basic_ofstream是一个模板。然后有两个“快捷方式名称”:
ofstream for basic_ofstream<char>
wofstream for basic_ofstream<wchar_t>为什么他们被命名为basic..。也许是因为标准库只提供基本版本,而客户端可以编写非基本类并将它们插入。如果您查看c++标准io库图,所有组件的前缀都是"basic“。
通常是通过替换basic_streambuf将定制的streambuf绑定到stream。一个来自boost的例子
#include <ostream>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/stream.hpp>
namespace io = boost::iostreams;
int main()
{
io::stream_buffer<io::file_sink> buf("log.txt");
std::ostream out(&buf);
// out writes to log.txt
}它是一个使用std::ostream的缓冲区实现。
如果您想探索漂亮的实现,可以从boost::iostreams库和它们的示例中查看更多内容。不错的是和gzip在一起。它适用于ifstream
#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>
int main()
{
using namespace std;
ifstream file("hello.gz", ios_base::in | ios_base::binary);
filtering_streambuf<input> in;
in.push(gzip_decompressor());
in.push(file);
boost::iostreams::copy(in, cout);
}https://stackoverflow.com/questions/52007601
复制相似问题