2016-07-02 2 views
1

Jetons un foncteur simple,Terminologie entourant foncteurs

class LessThan { 
public: 
    explicit LessThan (int in) : val(in) {} 
    bool operator() (int param) const { 
     return param < val; 
    } 
private: 
    int val; 
}; 

que je peux utiliser comme ceci par exemple -

vector<int> myVector = factory(); 
size_t count = count_if(begin(myVector), end(myVector), LessThan(10)); 

Ma compréhension de la terminologie entourant foncteurs est que la classe LessThan est un foncteur. c'est-à-dire que c'est un type, pas un objet. c'est-à-dire abstrait, pas concret. Alors, comment appelons-nous LessThan(10)? Ici, nous créons un objet en instanciant le type de foncteur LessThan. Alors, l'appelons-nous un objet foncteur? Mais, les foncteurs sont des objets de fonction. Donc, LessThan(10) est un objet objet fonction?

N'est-ce pas absurde?

+0

objets * sont types *. Ou plutôt, ce sont des * instances * de types. Les classes définies par l'utilisateur sont des types et lorsque vous les instanciez, vous obtenez des objets de ce type. –

+2

@JesperJuhl Pour 'int a', ...' int' est un type et 'a' est un objet. Et les deux sont donc différents. –

+1

Si cela vous aide, pensez-y de la façon suivante: 'LessThan' est un type d'objet _function. 'LessThan (10)' est un objet _function. –

Répondre

1

La terminologie pour les objets de fonction est la même que la terminologie pour les objets normaux: votre foncteur LessThan(10) a un type, qui est class LessThan. Notez que votre foncteur est une combinaison d'une fonction (c'est-à-dire "inférieure à") et de l'un de ses arguments (par exemple, int val). Le même effet peut être obtenu par la composition foncteur:

auto f = bind(less<int>(), _1, 10); // f is LessThan(10) 

Demo.

+0

Génial ........ –

+1

@typetraitor C'est correct. Beaucoup de types de foncteurs représentent des fonctions pures, et n'ont donc pas d'état (par exemple 'std :: less',' std :: plus', etc.). Cela rend beaucoup plus facile de confondre le type et l'objet, car tous les objets de le type est essentiellement le même. – dasblinkenlight