section1.3_LLVM_ADT_Optional介绍及使用
LLVM的Optional是一个简单的容器,它可以包含或者不包含一个值。这类容器通常用来表示可以不存在的值,可以说是对裸指针和裸引用更安全,更表达性的一种替代。
使用
首先,你需要包含头文件llvm/ADT/Optional.h。
创建一个Optional实例非常简单。假设你有一个名为MyType的类型,你可以这样创建一个实例:
在这种情况下,MaybeValue被默认初始化为"无值"。然后你可以检查Optional是否有值:
你也可以在创建Optional实例的时候直接给它赋值:
要从Optional获取值,你可以使用*操作符:
但是在这之前你应该检查Optional是否有值,否则行为就是未定义的。如果Optional无值,这种方式可能会导致运行时错误。
你也可以使用getValueOr方法来从Optional获取值,如果Optional无值,就返回一个默认值:
实现细节
Optional的实现细节依赖于模板和特化。它有一个基类OptionalStorage,用来存储实际的值。OptionalStorage有两个模板参数,一个是值的类型T,另一个是bool类型的参数,用来表示T是否是一个平凡类型(trivial type)。
如果T是一个平凡类型,OptionalStorage就会使用一个简单的联合体(union)来存储它。如果T不是一个平凡类型,OptionalStorage就会使用一个字节数组来存储它,并且需要显式地调用构造函数和析构函数来创建和销毁T的实例。
Optional类只有一个数据成员,就是OptionalStorage的实例。当Optional被赋值时,它会创建一个T的实例并存储在OptionalStorage中。当Optional被重置为无值时,它会销毁T的实例。
总的来说,Optional是一个非常有用的工具,它可以帮助你表达一个值可能存在也可能不存在的情况,而不需要使用裸指针或者特殊的值来表示"无值"的状态。尽管Optional有一些额外的开销,但是它带来的安全性和表达力的提升往往是值得的。
Last updated