当前位置:  开发笔记 > 编程语言 > 正文

结合谓词

如何解决《结合谓词》经验,为你挑选了2个好方法。

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

让我们说我有这样的事情:

class MatchBeginning : public binary_function
{   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 tokens;

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

    vector::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"开头的字符串或第一个不以" - "开头的字符串.但是,这给了我一个错误(二进制'||'未定义).

有没有办法做到这一点?



1> gimpf..:

我可以推荐boost.lambda来组合这些任务的函数对象.虽然这样一个简单的问题有点重量级.(编辑)查看xhantt发布的社区wiki答案,以获取使用STL的一个好例子.

(旧的,不推荐的,回答)您可以为此编写自己的实用程序,类似于:

// here we define the combiner...
template
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
lazy_or_impl lazy_or(Left const& left, Right const& right) {
  return lazy_or_impl(left, right);
}

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



2> Ismael..:

那么你有std :: logical_or和std :: compose2可以完成这项工作

find_if(tokens.begin(), tokens.end(), 
  compose2(logical_or(),
    bind2nd(MatchBeginning(), "-b"),
    bind2nd(MatchBeginning(), "-")
  ) 
);

但我认为boost :: lambda和/或phoenix最后更具可读性,是我推荐的解决方案.

积分应该转到SGI文档.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有