可选作为返回值
std::optional<float> divide(float a, float b) {
if (b!=0.f) return a/b;
return {};
}
这里我们返回分数 a/b
,但是如果没有定义(将是无穷大),我们返回空的可选项。
一个更复杂的案例:
template<class Range, class Pred>
auto find_if( Range&& r, Pred&& p ) {
using std::begin; using std::end;
auto b = begin(r), e = end(r);
auto r = std::find_if(b, e , p );
using iterator = decltype(r);
if (r==e)
return std::optional<iterator>();
return std::optional<iterator>(r);
}
template<class Range, class T>
auto find( Range&& r, T const& t ) {
return find_if( std::forward<Range>(r), [&t](auto&& x){return x==t;} );
}
find( some_range, 7 )
在容器或范围 some_range
中搜索等于 7
的数字。find_if
用谓词来做。
如果找不到,则返回空的可选项,如果是,则返回包含迭代器的可选元素。
这允许你这样做:
if (find( vec, 7 )) {
// code
}
甚至
if (auto oit = find( vec, 7 )) {
vec.erase(*oit);
}
无需乱搞开始/结束迭代器和测试。