Ich bin fimilar mit std :: Funktion, aber ich bin ein Buch zu lesen, dass es einen Code wie folgt:std :: function Template Syntax
template<typename GameObject, typename Function>
std::function<void(SceneNode&, sf::Time)> derivedAction(Function fn)
{
return [=](SceneNode& node, sf::Time dt)
{
assert(dynamic_cast<GameObject *>(&node) != nullptr);
fn(static_cast<GameObject *>(&node), dt)
}
}
dann das Buch Verwendung Vorlage wie folgt aus:
Command moveLeft;//command is a structure
moveLeft.action//action is a std::function object
= derivedAction<Aircraft>(AircraftMover(-playerSpeed, 0));
//derivedAction specify<Aircraft> ???
meine Fragen sind:
1-derivedAction muss ein Objekt von std :: function, ich habe Referenzen geprüft, aber ich habe diese Art von initialazation nicht mit {} gefunden, wie das funktioniert?
2-es ist kompliziert für mich, den Lambda-Ausdruck zu verstehen, und warum gibt es eine Rückkehr dafür?
ich bin ziemlich verwirrt über dieses Stückchen Code, würde jede explination
eine andere Frage: wenn Gameobject typenname vor Function typename war, und wir verwendeten dieselbe Syntax, wenn wir abgeleiteteAction aufrufen, hätten wir einen Kompilierungsfehler? – shayan
so gibt die abgeleitete Funktion den gesamten Lambda-Ausdruck als eine std :: -Funktion zurück? – shayan
@shayan Wenn Sie diese beiden 'type's wechseln würden, würde das keinen Compilerfehler in der Definition verursachen. Es würde jedoch einen Compiler-Fehler beim Aufruf von "derivedAction" erzeugen, weil [Template Argument Deduction] (http://en.cppreference.com/w/cpp/language/template_argument_deduction) fehlschlägt. – Zereges