运行时指定的多个谓词

时间:2011-10-07 10:51:26

标签: c++ stl functor

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.然后解析命令,并将带有参数的适当运算符组合到一个谓词中。

2 个答案:

答案 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)

编辑: 考虑到您对“动态构图”的解释,上面的代码并不是您想要的。您需要一个表达式解析器和评估器。但这与您的实际代码示例几乎没有关系。对此没有简单的解决方案。您可以尝试检查一些表达式解析器库,看看它们/哪个适合您的问题。