Gemäß cplusplus.com, std::transform
wendet eine Operation nacheinander auf die Elemente eines (1) oder zwei (2) Bereichs an und speichert das Ergebnis in dem Bereich, der bei result beginnt. Das letzte Argument von std::transform
ist im Allgemeinen eine Funktion, die auf den Elementen des ersten Behälters eine Operation tut, aber ich nehme einen Funktor zum Gegenstand haben, wie folgt:Letztes Argument von std :: transform
struct functor {
functor(int x) : x(x) {}
int operator()(int x1) {return x + x1;}
private :
int x;
}
Dann anstelle einer Funktion, kann ich auch passieren die Instanz von Funktors, wie folgt aus:
vector<int> v1, v2;
v1.push_back(1);
v1.push_back(2);
v2.resize(v1.size());
std::transform(v1.begin(), v1.end(), v2.begin(), functor(1));
Meine Frage ist, wie weiß der Compiler, ob eine Funktion oder eine Instanz einer Funktor Klasse an die Funktion std::transform
weitergegeben? Wenn eine Instanz übergeben wird, was passiert dann intern, wenn die Funktion auf die Elemente des ersten Containers angewendet wird?
Sie können sich eine Beispielimplementierung ansehen, die unter [cppreference] (http://en.cppreference.com/w/cpp/algorithm/transform) präsentiert wird. Es handelt sich um eine Funktionsvorlage, die den Typ eines Funktors ableitet . Während einer semantischen Analysephase kennt ein Compiler die Arten von AST-Knoten und entwickelt einen Funktionsaufrufsyntaxknoten in einen richtigen Knoten/eine richtige Aktion (Aufruf einer Funktion oder Aufruf eines Funktionsaufrufoperators). –