Я использую шаблоны C ++ для передачи функторов Стратегии, чтобы изменить поведение моей функции. Работает нормально. Функтор, который я передаю, является классом без сохранения состояния, и он просто перегружает оператор () классическим способом функтора.
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 */
}
Я никогда не видел, чтобы кто-нибудь использовал конструктор как «работу» функтора, но, похоже, он должен работать. Есть ли преимущество? Есть ли недостатки? Мне нравится удаление странной двойной скобки «Оператор () (а)», но это, вероятно, просто эстетично.