gpt4 book ai didi

c++ - 使用 any_of 找到的值在 lambda 之外的返回中使用

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:52 24 4
gpt4 key购买 nike

一段工作代码:

std::vector<double>::iterator it = std::find_if(intersections.begin(), intersections.end(), [&](const double i) {return i >= 0;});
if (it != intersections.end())
return rayOrigin + *(it) * rayDirection);

但是我想用这样的东西

有没有办法以一种干净的方式(不使用临时变量)捕获 i,any_of 在这里找到并在 return 语句中使用它

if (std::any_of(intersections.begin(), intersections.end(), [&](const double i) {return i >= 0;}))
return rayOrigin + i * rayDirection);

最佳答案

我会编写一个基于范围的搜索器,它返回一个可以是 * 的对象取消引用(可能不止一次)以获取找到的东西,或在 bool 中评估确定是否找到它的上下文。

根据我的经验,这使代码更清晰,并使“我想知道它是否存在”的常见情况更简单,但允许您简洁地获取项目:

template<class Range, class F>
auto linear_search_if( Range&& r, F&& f )
// remove next line in C++14, it removes ADL `begin` capability:
-> typename std::iterator_traits<decltype( std::begin(r) )>::value_type*
// reproducing ADL begin in C++11 is a pain, so just use the above line
{
using std::begin; using std::end;
using iterator = decltype(begin(r));
using T = typename std::iterator_traits<iterator>::value_type;
using R = T*; // in C++17 I prefer std::optional<iterator>;
iterator it = std::find_if( begin(r), end(r), std::forward<F>(f) );
if (it != end(r))
return R(std::addressof(*it)); // return R(it); in C++17
else
return R(nullptr); // return R{}; in C++17
}

if (auto pi = linear_search_if( intersections, [&](auto i){return i>=0;})
return rayOrigin + *pi * rayDirection; // **pi in C++17

是的,你做一个*pi而不仅仅是 i .

关于c++ - 使用 any_of 找到的值在 lambda 之外的返回中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39255571/

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