C ++ ofstream против basic_ofstream - PullRequest
       2

C ++ ofstream против basic_ofstream

0 голосов
/ 24 августа 2018

Я в замешательстве.

Я узнаю об ofstream, кажется, что это действительно basic_ofstream в соответствии с:

Какова причина для класса с именем basic_ofstream с конструктором с именем ofstream?«базовый» подразумевает, что существует неосновная версия.Почему имя конструктора отличается от имени класса?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Это не конструктор с другим именем. Это специализация. Так что basic_ofstream это шаблон. Тогда у вас есть два «ярлыка»:

ofstream    for basic_ofstream<char>
wofstream   for basic_ofstream<wchar_t>

Почему они названы базовыми ... может быть, потому что стандартная библиотека предоставляет только базовые версии, а клиент может писать неосновные классы и подключать их. Если вы посмотрите на стандартную диаграмму библиотек io , все компоненты имеют префикс «основной».

Обычно это заменяет 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);
}
0 голосов
/ 24 августа 2018

Нет конструктора с именем ofstream (конструкторы не имеют имен), и нет класса с именем basic_ofstream (несмотря на то, что заявляет документация Microsoft).

basic_ofstream - это шаблон класса (который отличается от класса), а ofstream - это typedef name aka псевдоним типа, который относится к одному экземпляру этого шаблона, в частности к basic_ofstream<char>.

wofstream - это другое такое имя, которое относится к basic_ofstream<wchar_t>.

Это соглашение об именах, котороестандартная библиотека C ++ использует для определения различных вариантов типов, которые отличаются типом символа, который они используют.Другой набор имен, который следует за этим соглашением, является basic_string, string и wstring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...