我有一个过滤器功能列表。如果这些函数中的任何一个返回“ true”,则不应进一步处理事件。
std :: any_of似乎适合此用例,但我想保证按其添加到我的列表的顺序调用过滤器函数(因为它们可能会产生副作用)。因此,如果我使用std :: any_of,我需要知道它调用过滤器函数的顺序是确定性的,从列表的begin()到end()。
我已经检查了std :: any_of上的C ++标准和顺序执行策略,但是没有提到顺序保证。我没有找到关于cppreference的顺序保证的提法,也没有在stackoverflow上找到足够类似的答案。
我的结论是,没有订单保证。尽管大多数编译器可能会按顺序处理这些函数,但我不应该依赖它。
bool MyClass::event(QEvent* event)
{
std::vector<std::function<bool(QEvent*)> > functionList = getCurrentEventFilters();
const auto bFilter = std::any_of(functionList .begin(),
functionList .end(),
[&event](std::function<bool(QEvent*)> function) {return function(event);});
if (bFilter)
{
return true;
}
return Base::event(event);
}
Run Code Online (Sandbox Code Playgroud)
关于std::execution::sequenced_policy:
用此策略(通常指定为
std::execution::seq)调用的并行算法中元素访问函数的调用在调用线程中不确定地排序。
关于不定顺序:
的评估
A和B被测序不定:他们可以以任意顺序进行,但可能不会重叠:要么A会前完成B,或B将是之前完成A。
对我来说,这似乎是明确的声明,您不能依赖事物的顺序。
我没想到这个..
原则上,这对您来说并不重要。呼叫std::any_of或std::all_of带有副作用的东西似乎令人怀疑。
您询问顺序执行策略,但在未指定任何策略的情况下调用重载。这些可能有所不同,因为接受执行策略的重载要求ForwardIterator而另一个要求InputIterator:http : //eel.is/c++draft/alg.any.of。
然后,标准在这里说:http : //eel.is/c++draft/algorithms.requirements#4.1:
如果算法的模板参数名为
InputIterator,InputIterator1或InputIterator2,则模板参数应满足Cpp17InputIterator的要求。
这基本上意味着该实现只能增加输入迭代器,并且将按顺序处理范围。
相反,我不确定该实现是否会为某种其他类型的迭代器(例如随机访问的迭代器)提供其他算法版本。
一个相关的问题:为什么std :: transform不保证顺序(但是for_each保证顺序)?这不是为了技巧而实现的技巧吗?。那里的一条评论说:
该实现可以自由地检测更强的迭代器强度并应用其他算法(可能是乱序的)。
尽管有一些讨论。如果为true,则仅在迭代器为输入类型时才保证顺序。
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |