在C++中,有没有一个不那么冗长的习惯用法来拆包可选项
Is there a less verbose idiom for unpacking an optional in C++?
在我目前正在进行的项目中,我发现自己写了很多代码,如下所示,其中,get_optional_foo
返回一个std::optional:
//...
auto maybe_foo = get_optional_foo(quux, ...)
if (!maybe_foo.has_value())
return {};
auto foo = maybe_foo.value()
//...
// continue on, doing things with foo...
如果我得到一个空选项,我想退出函数;否则,我想为该值分配一个非可选变量。我已经开始使用用maybe_
前缀命名可选项的约定,但我想知道是否有某种方法可以做到这一点,这样我根本不需要为可选项使用临时名称?这个变量只用于检查null选项,如果有值,则取消引用。
您不需要中间对象。std::optional
支持一个指针接口来访问它,所以你可以像一样使用它
//...
auto foo = get_optional_foo(quux, ...)
if (!foo)
return {};
//...
foo->some_member;
(*foo).some_member;
与您的要求略有不同,但请考虑:
if (auto foo = get_optional_foo(1)) {
// ...
return foo->x;
} else {
return {};
}
这将函数的主体放在if()
块中,该块可能更可读。
我能想到的最短的:
auto maybe_foo = get_optional_foo(quux, ...)
if (!maybe_foo) return {};
auto &foo = *maybe_foo; // alternatively, use `*maybe_foo` below
如果函数中有多个选项,而且它们不太可能是空的,那么可以用try - catch
来包装整个函数。
try {
auto &foo = get_optional_foo(quux, ...).value();
auto &bar = get_optional_bar(...).value();
...
} catch (std::bad_optional_access &e) {
return {};
}
相关文章:
- 复制和交换习惯用法与移动操作之间的交互
- 命名参数习惯用法和(抽象)基类
- 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗
- 错误:使用复制和交换习惯用法的交换函数中"operator="的重载不明确
- 使用 PIMPL 惯用法,实现是否应始终是类的私有成员?
- C++移动分配可防止复制交换习惯用法
- 将 PIMPL 习惯用法与成员函数模板一起使用(无需预先了解所有可能的数据类型)
- 使用新线程在类似于 Scott Meyer 的单例习惯用法的实现中实例化单例是否安全?
- Pimpl习惯用法、单独的接口/实现文件和多个虚拟继承.如何
- C++迭代器"for loop"习惯用法,其步长> 1 并允许非随机访问反向迭代器
- 访问基类型数组成员(Int-to-type习惯用法)
- 基于智能指针的 CRTP 习惯用法的编译问题
- 通过C接口分配和释放资源的正确习惯用法
- 副本交换习惯用法的有效性
- 视图和控制器之间接口的习惯用法
- Boost:创建一组线程并等待所有线程的正确习惯用法是什么
- 当涉及分配器时,是否有类似于复制和交换习惯用法的东西
- 是具有复制和交换习惯用法的复制赋值运算符,建议进行自赋值检查
- C++或D:在没有动态调度的情况下解耦类的习惯用法
- 标准::rel_ops的惯用法