2016-07-02 21 views
1

Lassen Sie uns ein einfaches FunktorsTerminologie rund um functors

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

, die ich so zum Beispiel verwenden können -

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

Mein Verständnis der Terminologie rund um functors ist, dass die Klasse LessThan ein Funktor ist. d.h. es ist ein Typ, kein Objekt. es ist abstrakt, nicht konkret.

Also, was nennen wir LessThan(10)? Hier erstellen wir ein Objekt, indem wir den Funktortyp LessThan instanziieren. Also, nennen wir es ein Funktor-Objekt? Funktoren sind jedoch Funktionsobjekte. Also, LessThan(10) ist ein Funktionsobjekt Objekt ??

Ist das nicht absurd?

+0

Objekte * sind * Typen. Oder sie sind * Instanzen * von Typen. Benutzerdefinierte Klassen sind Typen, und wenn Sie sie instanziieren, erhalten Sie Objekte dieses Typs. –

+2

@JesperJuhl Für 'int a' ist ...' int' ein Typ und 'a' ist ein Objekt. Und die beiden sind also verschieden. –

+1

Wenn es hilft, denken Sie einfach so: 'LessThan' ist ein _Funktionsobjekttyp_. 'LessThan (10)' ist ein _Funktionsobjekt_. –

Antwort

1

Terminologie für Funktionsobjekte ist die gleiche wie die Terminologie für reguläre Objekte: Ihr Funktor LessThan(10) hat einen Typ, der class LessThan ist.

Beachten Sie, dass Ihr Funktor eine Kombination aus einer Funktion (d. H. "Weniger als") und einem seiner Argumente (z. B. int val) ist. Der gleiche Effekt kann durch Funktors Zusammensetzung erreicht werden:

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

Demo.

+0

Super ........ –

+1

@TypeTraitor Das ist richtig. Viele Funktortypen stellen reine Funktionen dar und haben somit keinen Zustand (zB 'std :: less',' std :: plus', etc.). Dadurch wird es viel einfacher, den Typ und das Objekt zu verwechseln, weil alle Objekte von die Art ist im Wesentlichen gleich. – dasblinkenlight