Использовали ли вы Boost property tree для чтения конфигураций?
Что проверяют
Был ли у вас практический опыт и понимаете ли вы ограничения библиотеки, а не только умеете вызвать read_json. Следом спрашивают, как вы обрабатываете отсутствующий ключ и почему не взяли специализированный парсер.
Как отвечать
Если использовали, опишите конкретно: формат, объём конфига, как код получал значения и как вёл себя на кривом файле. Свои детали важнее общих слов про гибкость.
Каркас технической части:
- структура:
boost::property_tree::ptree, дерево узлов со строковым значением и упорядоченным списком детей. Библиотека header-only; - парсеры:
read_xml,read_json,read_ini,read_infoи парныеwrite_*. Ошибки разбора приходят исключением, производным отfile_parser_error, с номером строки; - доступ по пути:
pt.get<int>("server.port")бросаетptree_bad_path, если ключа нет, иptree_bad_data, если значение не приводится к типу.get("server.port", 8080)вернёт значение по умолчанию,get_optional<int>вернётboost::optional; - XML: атрибуты лежат под служебным узлом
<xmlattr>, путь выглядит какserver.<xmlattr>.port; - INI: только секции и ключи, дерево глубже двух уровней
write_iniне запишет.
Главное ограничение: ptree хранит всё строками. JSON-массивы превращаются в детей с пустыми ключами, null, числа и булевы значения не различаются, а write_json пишет числа в кавычках. Поэтому для JSON разумнее Boost.JSON или nlohmann/json, для TOML toml++, для YAML yaml-cpp. Property tree остаётся удобным для небольших XML и INI там, где Boost уже подключён.
Если не использовали, скажите прямо и расскажите, чем читали конфиги (nlohmann/json, QSettings в Qt) и как их валидировали. Интервьюеру это важнее названия библиотеки.
Где спотыкаются
Зовут get<T> без обработки исключений, и опечатка в конфиге роняет сервис при старте без понятного сообщения.
Пишут JSON через ptree и отдают другому сервису. Тот получает "port": "8080" строкой и падает на валидации схемы.
Не учитывают, что точка служит разделителем пути, и ломаются на ключах вида api.example.com. Разделитель меняется через ptree::path_type("a/b", '/').