Is there any way that you can combine predicates?
Lets say I have something like this:
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; }
This works, but now I’d like to do something like:
searchResult = find_if(tokens.begin(), tokens.end(), bind2nd(MatchBeginning(), '-b') || not1(bind2nd(MatchBeginning(), '-')));
So I’d like to find the first string that starts with ‘-b’ or the first string that does not start with ‘-‘. However, this gives me an error (binary ‘||’ undefined).
Is there any way to do this?
I can recommend boost.lambda for combining function-objects for such tasks. Although it is a bit heavyweight for such a simple problem. (edit) See the community wiki answer started by xhantt for a good example using STL.
(old, deprecated, answer) You can write your own utility for this, similar:
and then use it:
... lazy_or(bind1st(...), bind1st(...)) ...