Equivalent of const_cast for std::optional
Equivalent of const_cast for std::optional
My class' 接口包含一个可能不存在的对象的访问器。目前,它返回一个可能为 null 的指针。我想按照此处的建议将指针替换为std::optional
。访问器有一个const
重载,它使用 Meyers 的const_cast技巧来避免重复相同的代码两次。
简而言之,我想替换这个:
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
?
正如其他人提到的,在 c++14 标准中,使用引用类型实例化std::optional
格式不正确。(请参阅 N3690 20.6.2。因此,使用 std::optional
作为指针(指向单个对象的缺失由值 nullptr
表示)的直接替换是不可行的,除非您愿意按值而不是按引用复制对象。
但是,该规范为将来添加此类功能敞开了大门。此外,N7.15 的第 3672 节建议使用 std::reference_wrapper
的解决方法。
更新:此外,@HowardHinnant通知我,包含在标准中已经完全脱离了 c++14。
相关文章:
- 检查某些类型是否是模板类 std::optional 的实例化
- 使用 std::optional,而不是自己的结构
- C++17:使用 std::optional 来评估枚举是否包含值
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 函数可以应用于 std::optional,并返回一个可选值吗?
- 为什么 std::optional::value_or 没有默认 ctor 类型的专用化?
- 使用std::optional时的命名返回值优化
- 为什么返回std::optional有时移动,有时复制
- 为什么 std::optional 的强制转换运算符被忽略了
- C++是否在 std::min 和 std::max 下标准化 std::optional 的行为?
- std::optional - 使用 {} 或 std::nullopt 构造空
- 我可以使用 std::optional 进行错误处理吗?
- 为什么在std::optional的某些实现中有一个虚拟工会成员?
- 有什么东西阻止std::optional::value_or()有条件地不例外吗?
- 子类化 std::optional时编译错误
- 如何在构造函数中使用 std::optional
- 函数模板参数推断使用 std::Optional 失败
- 什么时候适合使用 std::optional
- 为什么 std::optional 运算符* 没有 has_value() 的调试模式断言