STL中有运算符类,如less,equal_to,greater_equal等。如何轻松地将它们组合起来用于例如remove_if函数?
例如,我想删除大于0且小于3且不等于2的向量元素,那么它将类似于:
remove_if (v.begin(), v.end(), bind2nd(greater<int>(),0) + bind2nd(less<int>(),3) + not1(bind2nd(equal_to<int>(), 2)));
程序运行期间的用户可以指定过滤选项,例如他可以写:如果x&gt;则删除0&amp;&amp; x&lt; 3&amp;&amp; x!= 2,或者他可以写:如果x&gt;删除5 || x == 3.然后解析命令,并将带有参数的适当运算符组合到一个谓词中。
答案 0 :(得分:3)
实际上,这在你的情况下相当简单。
首先需要解析用户提供的语句,并将其转换为AST(抽象语法树)。事实证明,这个AST几乎已经适合了。
x > 0 && x < 3 && x != 2
可以表示为树:
AND
/ \
> AND
/ \ / \
x 0 < !=
/ \ / \
x 3 x 2
所有节点都应该从公共基类继承,您应该实现Visitor
来评估给定值的x
参数。
答案 1 :(得分:0)
我想通过“动态组合”你指的是“在线”组合谓词的能力。在您的示例中,谓词在编译时是已知的,因此,“动态”不是正确的术语。
考虑“Boost.Bind”。它为操作员重载提供了组合。
bind(greater<int>(),_1,0) && bind(less<int>(),_1,3) && !bind(equal_to<int>(), _1, 2)
编辑: 考虑到您对“动态构图”的解释,上面的代码并不是您想要的。您需要一个表达式解析器和评估器。但这与您的实际代码示例几乎没有关系。对此没有简单的解决方案。您可以尝试检查一些表达式解析器库,看看它们/哪个适合您的问题。