Reputation: 63
I'm trying to use the any_of function on a vector of bool's. The any_of function requires a unary predicate function that returns a bool. However, I can't figure out what to use when the value input into the function is already the bool that I want. I would guess some function name like "logical_true" or "istrue" or "if" but none of these seem to work. I pasted some code below to show what I am trying to do. Thanks in advance for any ideas. --Chris
// Example use of any_of function.
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char *argv[]) {
vector<bool>testVec(2);
testVec[0] = true;
testVec[1] = false;
bool anyValid;
anyValid = std::find(testVec.begin(), testVec.end(), true) != testVec.end(); // Without C++0x
// anyValid = !std::all_of(testVec.begin(), testVec.end(), std::logical_not<bool>()); // Workaround uses logical_not
// anyValid = std::any_of(testVec.begin(), testVec.end(), std::logical_true<bool>()); // No such thing as logical_true
cout << "anyValid = " << anyValid <<endl;
return 0;
}
Upvotes: 6
Views: 4918
Reputation: 5279
I ended up here looking for a C++ standard library symbol to do this:
template<typename T>
struct true_ {
bool operator()(const T&) const { return true; }
};
which I think is what the op wants, and which can be used, e.g., as follows:
std::any_of(c.begin(), c.end(), std::true_);
I could not find anything like this in the standard library, but the struct above works and is simple enough.
While the any_of
expression above makes no sense in isolation (it would always return true
, unless c
is empty), a valid use case of true_
is as a default template argument for a template class expecting a predicate.
Upvotes: 0
Reputation: 76240
You can use a lambda (since C++11):
bool anyValid = std::any_of(
testVec.begin(),
testVec.end(),
[](bool x) { return x; }
);
And here's a live example.
You can, of course, use a functor as well:
struct logical_true {
bool operator()(bool x) { return x; }
};
// ...
bool anyValid = std::any_of(testVec.begin(), testVec.end(), logical_true());
And here's a live example for that version.
Upvotes: 6
Reputation: 4206
Looks like you want something like an identity function (a function that returns whatever value it is passed). This question seems to suggest no such thing exists in std::
:
Default function that just returns the passed value?
In this case the easiest thing might be to write
bool id_bool(bool b) { return b; }
and just use that.
Upvotes: 4