Я использую шаблоны С++ для передачи функторов стратегии, чтобы изменить поведение моей функции. Это работает нормально. Функтор, который я передаю, представляет собой класс без сохранения состояния и памяти, и он просто перегружает оператор () классическим способом функтора.
template <typename Operation> int foo(int a)
{
int b=Operation()(a);
/* use b here, etc */
}
Я делаю это часто, и это работает хорошо, и часто я создаю шаблоны с 6 или 7 шаблонными функторами!
Однако я беспокоюсь как об элегантности кода, так и об эффективности. Функтор не имеет состояния, поэтому я предполагаю, что конструктор Operation() бесплатен, а вычисление функтора так же эффективно, как встроенная функция, но, как и у всех программистов на C++, у меня всегда есть некоторые мучительные сомнения.
Мой второй вопрос заключается в том, могу ли я использовать альтернативный функторный подход... тот, который не переопределяет оператор (), но делает все в конструкторе как побочный эффект! Что-то вроде:
struct Operation {
Operation(int a, int &b) { b=a*a; }
};
template <typename Operation> int foo(int a)
{
int b;
Operation(a,b);
/* use b here, etc */
}
Я никогда не видел, чтобы кто-нибудь использовал конструктор как «работу» функтора, но, похоже, он должен работать. Есть ли преимущество? Какой-то недостаток? Мне нравится удаление странной двойной скобки "Operator()(a)" , но это, скорее всего, просто эстетика.