#include #include #include template requires std::totally_ordered_with // multiple ? combine in auto pred = // a separate concept [](LHS lhs, RHS rhs) { return lhs < rhs; }; template bool smaller(LHS lhs, RHS rhs) requires std::totally_ordered_with { return lhs < rhs; } template bool cmp3(Fun fun, LHS lhs, RHS rhs) requires std::relation { return fun(lhs, rhs); } template T1 fun(T2) { return T1{}; } template bool cmp2(LHS lhs, RHS rhs) requires std::relation), LHS, RHS> { return pred(lhs, rhs); } //relation template struct Less { bool operator()(LHS lhs, RHS rhs) const { return lhs < rhs; } }; template typename Pred, typename LHS, typename RHS> bool cmp(LHS lhs, RHS rhs) requires std::relation, LHS, RHS> { return Pred{}(lhs, rhs); } int main() { std::cout << cmp (5, 4.9) << '\n'; std::cout << cmp (5, "hello world") << '\n'; } //= // //int main() //{ // std::cout << // cmp2(3, 4) << ' ' << // cmp2(3.2, 4) << ' ' << // cmp2(3, 4.2) << ' ' << // cmp2(3.3, 4.4) << ' ' << // cmp < Less >(5, 4) << ' ' << // cmp3( smaller, 5, 4) << ' ' << // '\n'; // // int x = fun(std::string{}); // x += 12; //} //