() Скобки после функтора, но не указатель на функцию? - PullRequest
0 голосов
/ 29 октября 2018

Ниже приведен простой пример с вещами, которые меня раздражают. Также ссылка на онлайн-компилятор c ++ с данным примером находится здесь https://ide.geeksforgeeks.org/oxQd8FU2NV

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template <class T>
void PrintF (const T& printInt) { cout << printInt << " "; }

template <class T>
class PrintClass {
public:
void operator()(T elem) const {
    cout << elem << " ";
}
};

int main () {
vector<int> vect;
for (int i=1; i<10; ++i) {
    vect.push_back(i);
}


for_each (vect.begin(), vect.end(), PrintClass<int>()); cout << endl;

for_each (vect.begin(), vect.end(), PrintF<int>);      cout << endl;

//  for_each (vect.begin(), vect.end(), PrintF<int>() );  
//  won't compile because of ()  in PrintF<int>()

return 0;
}

Почему мы не можем написать PrintClass<int>() без (), например, PrintClass<int> (первая строка for_each)?

И при использовании функции (не объекта функции) мы не должны использовать () (вторая строка for_each), поэтому мы пишем так PrintF<int>?

Как мне интерпретировать / анализировать третий аргумент в этих двух функциях for_each?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

PrintF<int> - это функция. Мы передаем функцию на for_each. Вставка скобок будет неправильной, так как мы пытаемся (безуспешно) вызвать функцию.

PrintClass<int> это класс. Мы не можем пропустить классы, потому что они не ценности. Однако мы можем передавать экземпляры этого класса, поэтому мы создаем экземпляр класса и передаем его. Следующие два вызова будут иметь одинаковый результат

for_each (vect.begin(), vect.end(), PrintClass<int>());

PrintClass<int> myFunction = PrintClass<int>();
for_each (vect.begin(), vect.end(), myFunction);
0 голосов
/ 29 октября 2018

std::for_each требует объекта, который можно использовать как функцию. Когда вы используете

for_each (vect.begin(), vect.end(), PrintF<int>);

PrintF<int> затухает до указателя на функцию PrintF<int>, а затем for_each может использовать этот указатель для вызова функции PrintF<int>.

В

for_each (vect.begin(), vect.end(), PrintClass<int>());

PrintClass<int> - это имя класса, это не объект. Вам нужно () в конце, чтобы сказать компилятору сделать временный объект типа PrintClass<int>, и тогда for_each может использовать этот объект для вызова его operator ().

...