Eeroiki заставил меня идти в правильном направлении. В конечном итоге я остановился на этом (обратите внимание, что сравниваемые объекты на самом деле не являются целочисленными, и к ним можно применить широкий диапазон компараторов).
using intCompFunc = std::function<bool(const int,const int)>
struct compInt {
intCompFunc comp;
bool operator() (const int a, const int b) const {
return comp(a, b);
}
void foo (intCompfunc icf)
{
compInt ci { icf };
std::set<int,compInt> s1(ci);
}
Что означает, что пользователь может передать любой вид функтора, например лямбда:
foo([] (const int a, const int b) { return a < b; });
Моя путаница проистекает из-за того, почему это не так, во-первых, что я считаю действительно исторической проблемой (не было функторов C ++ 11, когда был написан STL ). OTOH, использование базового типа вместо параметра шаблона приводит к некоторым накладным расходам во время выполнения.