C++ unary function for logical true

4.4k Views Asked by At

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;
}
4

There are 4 best solutions below

0
Andrey Mishchenko On

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.

0
Shoe On

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.

0
Florian Winter On

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.

0
Escape0707 On

As of C++20, we get std::identity, which could be helpful.