🐷
yaml-cppを少し便利に
概要
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