c++ - 组合谓词

标签 c++ stl functional-programming predicate

有什么方法可以组合谓词吗?

假设我有这样的东西:

class MatchBeginning : public binary_function<CStdString, CStdString, bool>
{   public:
          bool operator()(const CStdString &inputOne, const CStdString &inputTwo) const
    {   return inputOne.substr(0, inputTwo.length()).compare(inputTwo) == 0;    }
};

int main(int argc, char* argv[])
{
    CStdString myString("foo -b ar -t az"); 

    vector<CStdString> tokens;

    // splits the string every time it encounters a "-"
    split(myString, tokens, "-", true, true);   

    vector<CStdString>::iterator searchResult = find_if(tokens.begin(), tokens.end(), not1(bind2nd(MatchBeginning(), "-")));        

    return 0;
}

这行得通,但现在我想做类似的事情:

searchResult = find_if(tokens.begin(), tokens.end(), bind2nd(MatchBeginning(), "-b") || not1(bind2nd(MatchBeginning(), "-")));

所以我想找到第一个以“-b”开头的字符串或第一个不以“-”开头的字符串。但是,这给了我一个错误(二进制“||”未定义)。

有什么办法吗?

最佳答案

我可以推荐 boost.lambda 来组合此类任务的函数对象。虽然对于这么简单的问题来说有点重量级。 (编辑)请参阅由 xhantt 发起的社区维基回答以获得使用 STL 的良好示例。

(old, deprecated, answer) 您可以为此编写自己的实用程序,类似:

// here we define the combiner...
template<class Left, class Right>
class lazy_or_impl {
  Left m_left;
  Right m_right;
public:
  lazy_or_impl(Left const& left, Right const& right) : m_left(left), m_right(right) {}
  typename Left::result_type operator()(typename Left::argument_type const& a) const {
    return m_left(a) || m_right(a);
  }
};

// and a helper function which deduces the template arguments
// (thx to xtofl to point this out)
template<class Left, class Right>
lazy_or_impl<Left, Right> lazy_or(Left const& left, Right const& right) {
  return lazy_or_impl<Left, Right>(left, right);
}

然后使用它:... lazy_or(bind1st(...), bind1st(...)) ...

关于c++ - 组合谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/545394/

相关文章:

c++ - OpenCV:查找轮廓(); - 我使用的是什么内核

c++ - 由于构造函数无法推回类对象

c++ - 如何创建具有预定义状态的自定义 Quick QML 项

c++ - vector -首先出现k值

c++ - 我不明白 map 插入时的这个错误

java - 我的整数列表在哪里变成了可选<Integer>列表?

c++ - 使用索引 vector 重新排序 vector

c++ - vector 中的成员类型是什么意思?

c++ - std::list 删除不兼容的迭代器

functional-programming - 对惰性序列的评估感到困惑