🐷

yaml-cppを少し便利に

2023/02/06に公開

概要

YAML形式で書かれた簡単な設定ファイルを、"cpp-yaml":https://github.com/jbeder/yaml-cpp (ver.0.7.0)を使って"Boost.PropertyTree":https://www.boost.org/doc/libs/1_81_0/doc/html/property_tree.html のように手軽にパスを指定して値を取得する方法.

取得関数

template<typename ValueType, typename Key>
std::optional<ValueType> as_recursive(const YAML::Node& node, const Key& key)
{
    if (!node) { return std::nullopt; }
    const auto& n = node[key];
    if (n) {
        return n.as<ValueType>();
    }
    return std::nullopt;
}
template<typename ValueType, typename FirstKey, typename...Keys>
std::optional<ValueType> as_recursive(const YAML::Node& node, const FirstKey& key, const Keys&...keys)
{
    if (!node) { return std::nullopt; }
    const auto& n = node[key];
    if (n) {
        return as_recursive<ValueType>(n, keys...);
    }
    return std::nullopt;
}

使い方

const YAML::Node node = YAML::Load("YAMLで書かれた設定情報");

const auto exist_value = as_recursive<int>(node, "config", "number");
assert(exist_value.has_value);

const auto not_exist_value = as_recursive<int>(node, "config", "not_exist");
assert(!not_exist_value.has_value());

const auto invalid_key_type = as_recursive<int>(node, "config", 1);
assert(!invalid_key_type.has_value());

Discussion