我的类的接口包括一个可能不存在的对象的访问器。目前,它返回一个可能为空的指针。我想按照这里std::optional
的建议替换指针。访问器有一个重载,它使用Meyers 的 const_cast 技巧来避免重复相同的代码两次。const
简而言之,我想替换它:
T const * MyClass::get() const {
/* non-trivial */
}
T * MyClass::get() {
return const_cast<T *>(const_cast<MyClass const *>(this)->get());
}
有了这个:
std::optional<T const &> MyClass::get() const {
/* non-trivial */
}
std::optional<T &> MyClass::get() {
auto t = const_cast<MyClass const *>(this)->get();
return t ? std::optional<T &>(const_cast<T &>(* t)) : std::nullopt;
}
更换似乎不令人满意,因为:
- 它引入了一个分支;
- 额外的复杂性在某种程度上违背了使重载成为轻量级(并且被编译器简单地优化掉)的目标。
我假设std::optional
引用的专门化基本上可以归结为一个增加安全性的指针,因此想知道是否有某种方法可以保持指针解决方案的简单性。有没有更令人满意的方法来编写要使用的访问器重载std::optional
?