#include <algorithm>
#include <iostream>
#include <vector>

template <typename Comparer>
struct InvComparer
{
public:
    explicit InvComparer(Comparer comparer) : comp(comparer) {}
    template <typename T1, typename T2>
    constexpr bool operator() (const T1& lhs, const T2& rhs) const { return comp(rhs, lhs); };
private:
    Comparer comp;
};

int main()
{
    std::vector<int> v = {16, 15, 4, 8, 42, 23};
    
    auto comp = std::less<>{};
    std::sort(v.begin(), v.end(), comp);
    
    for (const auto e : v) { std::cout << " " << e; }
    std::cout << std::endl;
    
    InvComparer<decltype(comp)> invComp{comp};
    std::sort(v.begin(), v.end(), invComp);
    for (const auto e : v) { std::cout << " " << e; }
    std::cout << std::endl;
    
    // check that inverse of < is > and not >=
    std::cout << std::boolalpha << invComp(42, 42) << std::endl;
}