如何用三元运算符实现返回std::optional<T>类型的单行代码逻辑?
如何用三元运算符实现返回std::optional类型的单行代码逻辑?
这个问题我之前写代码的时候也踩过坑!确实直接写三元运算符会编译失败,原因其实很直观:C++的三元运算符要求两个分支的类型能够隐式转换到同一个公共类型,而你这里compute_value()返回的T和std::nullopt对应的std::nullopt_t,这俩类型之间没有默认的隐式转换关系,编译器找不到合适的公共类型,自然就报错了。
不过标准库本身就有现成的解决办法,给你几个可行的方案:
显式构造std::optional
包裹返回值
把compute_value()的结果直接用std::optional<T>构造,这样左边分支的类型就是std::optional<T>,而右边的std::nullopt可以隐式转换成std::optional<T>,类型就统一了:std::optional<T> foo() { return compute_condition() ? std::optional<T>(compute_value()) : std::nullopt; }用std::make_optional生成optional对象
标准库的std::make_optional函数会直接返回一个std::optional<T>类型的对象,和右边的std::nullopt(可隐式转为std::optional<T>)完美匹配,写法也更简洁:std::optional<T> foo() { return compute_condition() ? std::make_optional(compute_value()) : std::nullopt; }C++17及以上:用类模板实参推导简化写法
如果你用的是C++17或更高版本,可以利用类模板实参推导,直接用列表初始化创建std::optional,代码更紧凑:std::optional<T> foo() { return compute_condition() ? std::optional{compute_value()} : std::nullopt; }
这些方案都是完全基于C++标准库的特性,不需要任何额外的工具或者扩展,完全符合标准要求。
内容来源于stack exchange
相关产品推荐
相关产品推荐

