I am trying to constrain a Callable to return a boolean when evaluated. I have been trying to use the concept std::predicate, but it does not seem to do what I want it to do.
So I defined my own concept, that is invokable and returns something convertible to a boolean. But again, I struggle understanding what I can or can not do with it, and I wonder what are the actual use cases of std::predicate?
#include<concepts>
#include<string>
template<class F, class... Args>
concept Predicate = std::invocable<F, Args...> &&
std::convertible_to<std::invoke_result_t<F, Args...>, bool>;
int main(int argc, char *argv[])
{
constexpr Predicate auto f1 = [](){return true;}; // ok
constexpr std::predicate auto f2 = [](){return true;}; // ok
constexpr int x = 34;
constexpr Predicate auto f3 = [x](){ return x==42;}; // ok
// Pas ok: error: deduced initializer does not satisfy placeholder constraints
//constexpr Predicate auto f4 = [](auto x){ return x==42;};
//constexpr std::predicate auto f5 = [](auto x){ return x==42;};
}