1. 作业概述与核心任务
这次CS106L课程的第六次作业要求我们实现一个简单的课程查询系统。核心任务分为两个部分:
-
在CourseDatabase类中实现find_course方法,从成员变量courses中查找与传入字符串course_title匹配的课程,返回std::optional
类型的结果。 -
在main函数中,使用Monadic操作(and_then/or_else)将std::optional
转换为格式化的字符串输出。如果找到课程则返回"Found course: title,number_of_units,quarter\n",否则返回"Course not found.\n"。
这个作业很好地结合了C++17引入的std::optional和Monadic操作这两个现代C++特性,让我们在实际场景中理解它们的用法和价值。
2. std::optional深度解析
2.1 为什么需要std::optional
在传统C++中,我们通常使用特殊值(如nullptr、-1等)或异常来表示"无结果"的情况。这种方式有几个问题:
- 不够直观:特殊值的含义需要额外文档说明
- 容易出错:忘记检查特殊值会导致未定义行为
- 类型不安全:特殊值可能与有效值混淆
std::optional
2.2 find_course实现细节
在CourseDatabase类中,我们需要遍历courses向量,查找标题匹配的课程:
cpp复制std::optional<Course> find_course(std::string course_title) {
for(const auto& elem : courses) {
if(elem.title == course_title) {
return elem; // 找到则返回包含Course的optional
}
}
return {}; // 未找到返回空的optional
}
这里有几个关键点
