namespace option_tools {
template <typename T>
bool safeGet(const YAML::Node& node, const std::string& key, T* output) {
if (node[key].IsDefined()) { // 检查是否定义了该键
try {
*output = node[key].as<T>(); // 尝试将节点值转换为指定类型
return true; // 成功获取并返回true
} catch (const YAML::BadConversion& e) { // 捕获转换异常
std::cerr << "Error: Bad conversion for key '" << key << "'" << std::endl;
}
}
return false; // 获取失败,返回false
}
}
safeGet
的功能详解
-
模板函数:
safeGet
是一个模板函数,这意味着它可以适用于多种数据类型T
,例如bool
,int
,std::string
等。 -
参数解释:
const YAML::Node& node
: 一个常量引用,指向包含配置信息的 YAML 节点(例如yaml_node["logging"]
)。const std::string& key
: 需要提取的配置项的键名,例如"enable"
。T* output
: 一个指向模板类型T
的指针,用于存储提取的值。
-
返回值:函数返回一个布尔值 (
bool
):- 如果成功提取到值并且类型匹配,返回
true
。 - 如果提取失败(如键不存在或类型不匹配),返回
false
。
- 如果成功提取到值并且类型匹配,返回
函数的具体操作流程
-
检查键是否存在:
- 使用
node[key].IsDefined()
检查 YAML 节点中是否定义了给定的键名key
。 - 如果键存在,继续执行;如果不存在,直接返回
false
。
- 使用
-
提取和类型转换:
*output = node[key].as<T>();
尝试将 YAML 节点中对应键的值转换为模板类型T
。as<T>()
是yaml-cpp
库中的一个方法,用于将 YAML 节点的值转换为指定的类型。
-
异常处理:
- 如果转换过程中发生了类型错误(例如尝试将一个字符串转换为整数),会抛出
YAML::BadConversion
异常。 - 在这种情况下,
safeGet
捕获该异常并输出错误信息,然后返回false
。
- 如果转换过程中发生了类型错误(例如尝试将一个字符串转换为整数),会抛出
-
返回结果:
- 如果没有发生异常且提取成功,返回
true
,表示成功获取并转换值。 - 否则,返回
false
,表示获取失败。
- 如果没有发生异常且提取成功,返回
safeGet
的优点
- 安全性:可以避免因缺少配置项或类型不匹配导致程序崩溃。
- 可维护性:提供了一个简单的接口,用于从复杂的配置文件中提取参数,而不需要反复检查键是否存在或处理异常。
- 灵活性:由于它是模板函数,可以处理多种类型的数据提取需求。