Erklärung der Funktion std::bind und der std::placeholder
Verfasst: Fr Okt 28, 2016 6:22 pm
Hallo,
in meinem "Selbststudium" bin ich jetzt schön öfters über die Funktion std::bind gestoßen. So richtig kann ich mir noch nicht erklären wie genau diese funktioniert und selbst mit mehreren Erklärungen, welche ich im Netz gefunden habe, konnte ich noch nicht so viel damit anfangen, bzw. war mir dies dann nicht so richtig einleuchtend.
In meinem Projekt geht es darum, dass es ein Objekt (in meinem Fall ein Flugzeug) ein anderes Objekt (hier jetzt ein PickUp, welche das Leben wieder auffülen soll) einsammeln soll.
So habe ich die Klasse Aircraft für mein Flugzeug und ein Struct Pickup:
Hier wäre der erste Punkt ob ich es bisher richtig verstanden habe: std::function ist quasi ein Funktions-Wrapper in dem ich Funktionen mit der entsprechenden Signatur "hineinpacken" kann.
Das war soweit auch alles verständlich.
Nun wird das ganze initialisiert: da es mehrere Arten von Pickups gibt, hat jede Art seine eigene "Wirkungsweise" -> Funktion.
So richtig ist mir nicht ganz klar was nun wirklich hier geschieht. In den Erklärungen stand das std::bind Argumente an Funktionen bindet... aber was heißt das nun genau und was genau macht der placeholder an der Stelle.
Noch um ein anderes Pickup zu zeigen bei dem kein Argument erwartet wird
Vielleicht gibt es ja eine Erklärung die man als Normalsterblicher auch versteht. Was genau geschieht mit dem Placeholder und wie genau kann man sich das vorstellen das ein weiteres Argument an eine Funktion "gebunden" wird.
Mit freundlichen Grüßen
in meinem "Selbststudium" bin ich jetzt schön öfters über die Funktion std::bind gestoßen. So richtig kann ich mir noch nicht erklären wie genau diese funktioniert und selbst mit mehreren Erklärungen, welche ich im Netz gefunden habe, konnte ich noch nicht so viel damit anfangen, bzw. war mir dies dann nicht so richtig einleuchtend.
In meinem Projekt geht es darum, dass es ein Objekt (in meinem Fall ein Flugzeug) ein anderes Objekt (hier jetzt ein PickUp, welche das Leben wieder auffülen soll) einsammeln soll.
So habe ich die Klasse Aircraft für mein Flugzeug und ein Struct Pickup:
Code: Alles auswählen
class Aircraft {
...
void repair(int points) { mHitpoints =+ points;}
int mHitpoints;
...
};
struct PickupData {
Textures::ID textures;
std::functional<void(Aircraft&) action;
}
Das war soweit auch alles verständlich.
Nun wird das ganze initialisiert: da es mehrere Arten von Pickups gibt, hat jede Art seine eigene "Wirkungsweise" -> Funktion.
Code: Alles auswählen
std::vector<PickupData> data() {
std::vector<PickupData> data(Pickup::TypeCount); //Pickup ist die Klasse an sich der Pickups und TypeCount das letzte Enum-Element in dem sämtliche Arten der Pickups drin stehen
data[Pickup::HealtRefill].texture = Texture::HealtRefill; //TextureID übergeben welche in einem Enum Texture drin steht
data[Pickup::HealtRefill].action = std::bind(&Aircraft::repair, std::placeholder::_1, 25); //und hier ist nun die krux... es funktioniert aber warum ^^
...
return data;
}
Noch um ein anderes Pickup zu zeigen bei dem kein Argument erwartet wird
Code: Alles auswählen
...
data[Pickup::FireRate].action = std::bind(&Aircraft::increasFireRate, std::placeholder::_1);
...
Mit freundlichen Grüßen