#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;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbXBhcmVyPgpzdHJ1Y3QgSW52Q29tcGFyZXIKewpwdWJsaWM6CiAgICBleHBsaWNpdCBJbnZDb21wYXJlcihDb21wYXJlciBjb21wYXJlcikgOiBjb21wKGNvbXBhcmVyKSB7fQogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkgKGNvbnN0IFQxJiBsaHMsIGNvbnN0IFQyJiByaHMpIGNvbnN0IHsgcmV0dXJuIGNvbXAocmhzLCBsaHMpOyB9Owpwcml2YXRlOgogICAgQ29tcGFyZXIgY29tcDsKfTsKCmludCBtYWluKCkKewogICAgc3RkOjp2ZWN0b3I8aW50PiB2ID0gezE2LCAxNSwgNCwgOCwgNDIsIDIzfTsKICAgIAogICAgYXV0byBjb21wID0gc3RkOjpsZXNzPD57fTsKICAgIHN0ZDo6c29ydCh2LmJlZ2luKCksIHYuZW5kKCksIGNvbXApOwogICAgCiAgICBmb3IgKGNvbnN0IGF1dG8gZSA6IHYpIHsgc3RkOjpjb3V0IDw8ICIgIiA8PCBlOyB9CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgCiAgICBJbnZDb21wYXJlcjxkZWNsdHlwZShjb21wKT4gaW52Q29tcHtjb21wfTsKICAgIHN0ZDo6c29ydCh2LmJlZ2luKCksIHYuZW5kKCksIGludkNvbXApOwogICAgZm9yIChjb25zdCBhdXRvIGUgOiB2KSB7IHN0ZDo6Y291dCA8PCAiICIgPDwgZTsgfQogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgLy8gY2hlY2sgdGhhdCBpbnZlcnNlIG9mIDwgaXMgPiBhbmQgbm90ID49CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpib29sYWxwaGEgPDwgaW52Q29tcCg0MiwgNDIpIDw8IHN0ZDo6ZW5kbDsKfQ==