daniel_pr
@daniel_pr

Есть ли хоть какое-то преимущество использования функтора перед обычной функцией в данном случае?

template<class T>
struct display {
  void operator () (const T& value) const {
    std::cout << value << std::endl;
  } 
}

template<class T>
void fn_display(const T& value) {
  std::cout << value << std::endl;
}

int main() {
  std::vector<int> nums = { 1, 2, 3 };
  ...
}

Теперь я могу использовать либо функцию, либо функтор, но что лучше?
std::for_each(nums.cbegin(), nums.cend(), display<int>());

или
std::for_each(nums.cbegin(), nums.cend(), fn_display<int>);
  • Вопрос задан
  • 205 просмотров
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
У функтора перед функцией есть только одно преимущество - это наличие состояния функтора, которое может меняться между обращениями к его функциональному оператору и влиять на его поведение. Функтор настраивается эксклюзивно, функция - по понятным причинам - только глобально.
У функции перед функтором тоже есть преимущество - это адрес функции, по которому сразу можно начать ее исполнение. У функтора всегда будет два адреса - адрес метода функционального оператора и адрес самого функтора.

Исходя именно из этих преимуществ и следует выбирать между функтором и функцией.
Скажем, если бы нужно было nums вписать в CSV таблицу в виде матрицы, то проще использовать функтор. Создать его, настроить поток вывода, символ-разделитель столбцов, количество выводов до перехода на следующую строку и передать в std::for_each.
Если такая настройка поведения не требуется, от функтора лучше отказаться в пользу функции во всех случаях.

Функтор используется в реализации идиомы делегата и коллбека. Делегаты позволяют универсальным образом хранить самые разные точки исполнения кода и безопасно проводить по ним исполнение.
Если использование делегатов оправдано необходимостью, в делегаты оборачивают даже указатели на функцию, чтобы сохранить единообразие подхода к управлению исполнением.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы