gpt4 book ai didi

C++ 范围像 Java 流一样查找并返回 std::optional

转载 作者:行者123 更新时间:2023-12-04 17:22:30 26 4
gpt4 key购买 nike

在 Java 中, Stream.findFirst() returns Optional<T> .我希望对 std::ranges::find() 有类似的行为.如果未找到该值,则返回 last迭代器。如果 T 这很不方便是一个结构,我试图从中获取一个成员。这是一个演示代码:

    struct Person {
int age;
int height;
};

std::vector<Person> people;
people.emplace_back(20, 100);
people.emplace_back(23, 170);

// find the height of a 23yo person
std::optional<int> height1 = std::ranges::find(people, 23, &Person::age)->height;

// find the height of a 26yo person
std::optional<int> height2 = std::ranges::find(people, 26, &Person::age)->height; // error

当然我可以在每个 find 周围放置一些包装代码转换迭代器,但它使代码如此冗长和样板。我想知道 C++20 中是否有一些更惯用的方法来做到这一点?

    std::optional<int> height2;
auto iter = std::ranges::find(people, 26, &Person::age);
if (iter == people.end()) {
height2 = std::nullopt;
} else {
height2 = iter->height;
}

最佳答案

template <class ...ArgsT>
auto OpRangesFind(auto &&Range, ArgsT &&...Args)
{
auto Iter = std::ranges::find(Range, std::forward<ArgsT>(Args)...);
return Iter != Range.end() ? Iter : std::optional<decltype(Iter)>{std::nullopt};
}

int main()
{
/* ... */

auto OpIter = OpRangesFind(people, 26, &Person::age);
if (!OpIter.has_value()) {
std::cout << "not found\n";
} else {
std::cout << "found\n";
std::cout << "height: " << OpIter.value()->height << "\n";
// ^^^^^^^^
}
}

关于C++ 范围像 Java 流一样查找并返回 std::optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65384273/

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