В качестве решения другого вопроса представляется полезным создать «универсальные объекты функтора», которые обертывают различные стандартные (и, возможно, определяемые пользователем) шаблонные функции в объекте функтора.
Иногда они более полезны, чем соответствующие шаблонные функции, поскольку определенный тип функции «связывается поздно» при передаче в качестве объекта-функтора: только на сайте вызова внутри вызываемого абонента, а не у вызывающего. Например, вы не можете передать std::min
как объект функтора, вы должны передать экземпляр типа std::min<int>
, что означает, что вызываемый объект не может работать с различными однородными типами.
С другой стороны, вы можете передать min_functor
, как показано ниже, и правильная реализация min
будет выбрана на каждой стороне вызова в вызываемом абоненте.
struct min_functor {
template <typename T>
const T& operator()(const T& l, const T& r) const { return std::min(l,r); }
};
Наконец, вопрос: если я хочу определить несколько из них для различных двоичных операций, таких как max
и т. Д., Есть ли какой-нибудь способ сделать это без копирования приведенного выше шаблона, кроме макросов 1
1 Похоже, что макросы здесь будут работать очень хорошо, но я не могу смириться с презрением мощного анти-макро-лобби.