Сокращение шаблонов при создании объектов функторов для функций шаблона std - PullRequest
1 голос
/ 05 мая 2019

В качестве решения другого вопроса представляется полезным создать «универсальные объекты функтора», которые обертывают различные стандартные (и, возможно, определяемые пользователем) шаблонные функции в объекте функтора.

Иногда они более полезны, чем соответствующие шаблонные функции, поскольку определенный тип функции «связывается поздно» при передаче в качестве объекта-функтора: только на сайте вызова внутри вызываемого абонента, а не у вызывающего. Например, вы не можете передать 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 Похоже, что макросы здесь будут работать очень хорошо, но я не могу смириться с презрением мощного анти-макро-лобби.

1 Ответ

2 голосов
/ 05 мая 2019

Нет , поскольку вы не можете назвать шаблон функции без немедленного контекста, который определяет его специализацию.(Учтите, что аргументы шаблонов шаблонов должны быть шаблонами классов или псевдонимов.) Однако есть несколько предостережений:

  1. Несколько синтаксисов для этого было предложено .
  2. Шаблон функции может быть передан в качестве аргумента параметра, который является указателем на функцию (за счет отсутствия состояния и, вероятно, без встраивания).
  3. Некоторыесовременные конструкции используют функцию объекты напрямую, хотя на самом деле это просто та же самая модель заранее.
...