Использовать boost::filesystem с std::ifstream?

Я использую Ubuntu 20.04 LTS с C++ 20 и версией Boost 1.71.0.

Следующий код компилируется без ошибок и выводит содержимое файла примера:

#include <iostream>
#include <string>
#include <boost/filesystem.hpp>
#include <filesystem>

int main() {
    boost::filesystem::path output_dir = boost::filesystem::path("/out/");
    boost::filesystem::path sample_file = output_dir / "sample.txt";
    std::ifstream ifs{sample_file};
    std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
    std::cout << "Sample file content: " << std::endl << content << std::endl;
    return 0;
}

Так как же это работает? Это boost::filesystem::path неявно приведено к std::string?

Безопасно ли это использовать?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
166
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В документации Boost Filesystem fstream указано:

Заголовок стандартной библиотеки C++ использует const char* для передачи аргументов, представляющих имена файлов, причем такое использование происходит семь раз.

Заголовок fstream.hpp библиотеки файловой системы предоставляет эквивалентные компоненты в пространстве имен boost::filesystem, за исключением того, что семь аргументов const char* были заменены аргументами const path&.

Заголовок fstream.hpp библиотеки файловой системы просто использует компоненты стандартной библиотеки в качестве базовых классов, а затем переобъявляет конструкторы и открытые функции, чтобы они принимали аргументы типа const path& вместо const char*.

Документированное использование описано в 2-минутном руководстве и в примерах.

Дангит. Я как раз собирался ответить то же самое, но не нашел подходящих фраз. В любом случае вы получили мой голос.

André Lehto 10.04.2024 15:42

Однако они не используют boost::filesystem::ifstream, они используют std::ifstream

Alan Birtles 10.04.2024 15:59

Док говорит : (5) participates in overload resolution only if FsPath is std::filesystem::path.. Но в данном случае это неправда :/ поскольку FsPath есть boost::filesystem::path.

Marek R 10.04.2024 16:44

@MarekR этот ответ не является неправильным, вы можете использовать boost::filesystem::path, чтобы открыть boost::filesystem::ifstream, он просто не отвечает на этот вопрос, поскольку ОП использует std::ifstream

Alan Birtles 10.04.2024 18:04

std::basic_fstream имеет конструктор, который принимает шаблонный FSPath тип https://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream

Эта перегрузка должна принимать только std::filesystem::path, но похоже, что libstdc++ принимает любой класс , который соответствует интерфейсу std::filesystem::path . Это нестандартно и не компилируется с другими стандартными библиотеками: https://godbolt.org/z/njr5s3har

Вы можете исправить это с помощью заголовка boost/filesystem/fstream.hpp, но вам придется изменить std::ifstream на boost::filesystem::fstream. Лучшее решение — просто перейти на использование std::filesystem, что в основном является заменой boost::filesystem.

Другие вопросы по теме