Тип формального аргумента конструктора std::set
для объекта сравнения - Compare const&
, где Compare
- параметр шаблона.
Таким образом, даже если объект set сохранил ссылку на ваш фактический объект компаратора (вместо того, чтобы копировать его), он будет обрабатываться как тип Compare
, который по умолчанию установлен на std::less
.
А поскольку std::less
не является полиморфным, то вызывается std::less::operator()
, а не ваш operator()
в TestClassLessThan
.
Так что, вкратце, «вы не можете этого сделать».
Вернее, вы можете, как показывает ваш код, но вы не получаете никаких изменений поведения.
Чтобы изменить объект сравнения, вы должны указать другой тип Compare
в качестве аргумента шаблона.
Чего вы хотели избежать, но извините, пути нет (о котором я знаю).
Приветствия и hth.,