Синтаксис функтора C ++ - PullRequest
3 голосов
/ 20 мая 2019

У меня есть вопрос относительно синтаксиса вызова функтора в C ++.В приведенном ниже коде, почему первые 2 примера работают, в то время как 3-я и 4-я попытки не работают?

Также я могу позвонить ob (100);, и он выдаст 300, но почему я не могу позвонить Class(100) и есть ли у него вывод 300?Есть ли способ использовать перегруженный оператор () без создания нового объекта?

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std; 


struct Class
{ 
    void operator() (int a) 
    { 
        cout << a * 3 << " "; 
    } 
} ob; 


int main() 
{ 

    int arr[5] = { 1, 5, 2, 4, 3 }; 

    cout << "Multiple of 3 of elements are : "; 
    for_each(arr, arr + 5, Class());
    cout << endl; 
    for_each(arr, arr + 5, ob); 
    cout << endl; 

    // Why do these not work???
    for_each(arr, arr + 5, Class);
    for_each(arr, arr + 5, ob());

}

1 Ответ

6 голосов
/ 20 мая 2019

std::for_each, как и многие инструменты в библиотеке <algorithms>, ожидает, что что-то как функция будет передана.Давайте посмотрим на его подпись :

template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );

Ожидается, что тип UnaryFunction будет что-то , который вы можете передать по значению f, и который выможет вызываться как функция, как в f(value);

Есть пара вещей, которые удовлетворяют этому:

  • Указатели на функции
  • Объекты Functor, которые являются экземплярамикласс, который перегружает operator()
  • Lambdas (которые на самом деле являются просто объектами-функторами)

Имея это в виду, давайте рассмотрим ваш пример.


for_each(arr, arr + 5, Class());

Здесь Class() создает экземпляр класса, а UnaryFunction выводится как Class.Это экземпляр перегрузки класса operator(), так что это прекрасно.


for_each(arr, arr + 5, ob);

Здесь ob - это экземпляр Class, и, поскольку он передается по значению,это имеет тот же эффект, что и передача Class().


for_each(arr, arr + 5, Class);

Здесь вы пытаетесь передать тип , где ожидается значение.Это очень просто: нет-нет.


for_each(arr, arr + 5, ob());

Здесь вы звоните operator() на объект ob.Это плохо по двум причинам.1;потому что Class::operator() ожидает один int в качестве параметра, и это отсутствует.2;потому что это попытается передать значение, возвращаемое operator() в for_each.Поскольку вы определили Class::operator() для возврата void, это также не имеет смысла.

...