#include <iostream>
#include <set>
template <typename ,typename>
struct swap_set_comparator{};
template <typename new_comp,typename set_type,typename comp,typename alloc>
struct swap_set_comparator<new_comp,std::set<set_type,comp,alloc> >
{
using type = std::set<set_type,new_comp,alloc>;
};
template <typename container, typename... Args,typename Func>
auto make_set(Args&&... args,Func&& f)
{
return typename swap_set_comparator<Func,container>::type(std::forward<Args>(args)...,std::forward<Func>(f));
}
int main()
{
auto comparator = [](int *a, int *b){return *a<*b;};
std::set<int*,decltype(comparator)> S(comparator);
// or
auto S2 = make_set<std::set<int*>>([](int *a, int *b){return *a<*b;});
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgoKdGVtcGxhdGUgPHR5cGVuYW1lICx0eXBlbmFtZT4Kc3RydWN0IHN3YXBfc2V0X2NvbXBhcmF0b3J7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBuZXdfY29tcCx0eXBlbmFtZSBzZXRfdHlwZSx0eXBlbmFtZSBjb21wLHR5cGVuYW1lIGFsbG9jPgpzdHJ1Y3Qgc3dhcF9zZXRfY29tcGFyYXRvcjxuZXdfY29tcCxzdGQ6OnNldDxzZXRfdHlwZSxjb21wLGFsbG9jPiA+CnsKICAgIHVzaW5nIHR5cGUgPSBzdGQ6OnNldDxzZXRfdHlwZSxuZXdfY29tcCxhbGxvYz47Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgY29udGFpbmVyLCB0eXBlbmFtZS4uLiBBcmdzLHR5cGVuYW1lIEZ1bmM+CmF1dG8gbWFrZV9zZXQoQXJncyYmLi4uIGFyZ3MsRnVuYyYmIGYpCnsKICAgcmV0dXJuIHR5cGVuYW1lIHN3YXBfc2V0X2NvbXBhcmF0b3I8RnVuYyxjb250YWluZXI+Ojp0eXBlKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLixzdGQ6OmZvcndhcmQ8RnVuYz4oZikpOwp9CgoKaW50IG1haW4oKSAKewogICAgYXV0byBjb21wYXJhdG9yID0gW10oaW50ICphLCBpbnQgKmIpe3JldHVybiAqYTwqYjt9OwogICAgc3RkOjpzZXQ8aW50KixkZWNsdHlwZShjb21wYXJhdG9yKT4gUyhjb21wYXJhdG9yKTsKICAgIAogICAgLy8gb3IgCiAgICAKICAgIGF1dG8gUzIgPSBtYWtlX3NldDxzdGQ6OnNldDxpbnQqPj4oW10oaW50ICphLCBpbnQgKmIpe3JldHVybiAqYTwqYjt9KTsKICAgIHJldHVybiAwOwp9