gpt4 book ai didi

c++ - 如何在没有 if 语句的情况下返回 optional

转载 作者:行者123 更新时间:2023-11-30 01:45:06 29 4
gpt4 key购买 nike

假设我有一个函数可以查找并返回 vector 的最小元素。如果 vector 为空,它应该返回一个空的可选对象。有没有办法让我使用 optional<T>避免使用 if 语句或三元运算符的构造函数?

使用 if 语句:

optional<Foo> GetMinElement(vector<Foo> foos) {
vector<Foo>::iterator min_foo = std::min_element(foos.begin(), foos.end());
bool found_min_element = (min_foo != foos.end());
if (found_min_element) {
return *min_foo;
} else {
return nullopt;
}
}

使用三元运算符:

optional<Foo> GetMinElement(vector<Foo> foos) {
vector<Foo>::iterator min_foo = std::min_element(foos.begin(), foos.end());
bool found_min_element = (min_foo != foos.end());
return found_min_element ? optional<Foo>(*min_foo) : optional<Foo>(nullopt);
}

天真地,我只想传递 stl 的输出算法到 optional<T>构造函数并让它处理检查空指针的逻辑。有什么成语吗?

最佳答案

您必须记住,结束迭代器不是空指针。如果范围是一个子范围,它甚至可以是一个有效的迭代器。

我编写自己的范围算法。他们遵循与您不同的模式。

范围算法采用 class Range,启用 adl begin/end 并运行迭代器算法。然后它返回一个可选的迭代器(如果它是 end 则为空)。

这与您的略有不同,因为我的不返回元素的拷贝。

并且它们可以在原件所在的任何地方使用(加上 make_range(start,finish))。


如果您不喜欢 if 和 ? 的语法,这些可能会有所帮助:

template<class T>
std::optional<std::decay_t<T>> maybe(bool engage, T&&t){
if (!engage) return {};
return std::forward<T>(t);
}

甚至:

templace<class F>
std::optional<std::decay_t<std::result_of_t<F()>>>
perhaps(bool do_it, F&&f){
if (!engage) return {};
return std::forward<F>(f)();
}

哪些短路像 ? 一样。

namespace adl_helper{
using std::begin; using std::end;
template<class R> auto adl_begin(R&&)->decltype(begin(std::declval<R>())){
return begin(std::forward<R>(r));
}
template<class R> auto adl_end(R&&)->decltype(end(std::declval<R>())){
return end(std::forward<R>(r));
}
}
using adl_helper::adl_begin;
using adl_helper::adl_end;

template<class R>using iterator_t=decltype(adl_begin(std::declval<R>()));

template<class R>
optional<iterator_t<R>> min_element(R&& r) {
auto ret = std::min_element(adl_begin(r), adl_end(r));
return maybe(ret!=adl_end(r), ret);
}

我发现它比您的版本更有用。

有时你确实需要做一个额外的*,或者使用一个助手。

关于c++ - 如何在没有 if 语句的情况下返回 optional<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35050274/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com