Parameter zu verwenden, std::greater oder std::less als argument
Ich würde gerne eine Funktion mit einem parameter akzeptiert entweder std::greater<int>
oder std::less<int>
als argument. Ich bin fest an der syntax für den parameter, wenn.
Dies ist das format, das ich ausprobiert:
myFunction(int a, int b, bool *comp(int, int)) { … }
…
std::greater<int> bigger;
myFunction(2, 3, bigger);
Nicht Arbeit, obwohl, und ich vermute, dass der Dritte parameter ist einfach nur komplett falsch. Was soll es eigentlich werden?
konvertieren kann
std::greater<int>
zubool* (*)(int, int)
- pass
std::greater<int>()
statt - Danke. Ich aktualisiert meine Frage: in einer Instanz der größer ist anstelle der Klasse. Der Fehler ist der gleiche, ich wollte nur nicht, kopiere meinen code immer sorgfältig die erste Zeit. Mein schlechtes.
- Durch die Art und Weise, Ihre parameter ist eine Funktion (Umgerechnet auf eine Funktion Zeiger auf Sicht in diesem Kontext), dass zwei
int
s und die Rückgabe einerbool *
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Funktionen unter einem Komparator in der Regel realisiert durch templates:
aber Sie können auch die
std::function
es zu realisieren:Die erste version macht code in der Kopfzeile, sondern wird in der Regel eine bessere Leistung.
Da für die zweite version, können Sie verbergen die Implementierung in der .cpp-Datei,
aber würden Sie verlieren einige die Leistung aufgrund der Unmöglichkeit inline
Komparator Anrufe.
Also der trick hier ist, dass
std::less
undstd::greater
sind eigentlich zustandslose Funktion Objekte trivial konstruiert. Aber Sie unterstützen nicht bei der Umwandlung eines funktionszeigers.Effiziente Entscheidungen sind entweder (A) der Komparator über
template
argument und implementieren Sie den code in eine header:was bedeutet, dass Sie haben, um es zu implementieren, die in einer header-Datei, oder (B) geben Sie löschen Sie die function-Objekt, das über eine
std::function< bool(int, int) >
:die einige Kosten (vielleicht von Bedeutung? Profil!) (heap-Allokation vermieden, die durch einen kleinen Objekt-Optimierung für Staatenlose std weniger/mehr, aber es neigt dazu, Kosten
virtual
- Funktion, Anruf, unabhängig, die können auch blockieren inlining).Oder (C) schreiben Sie einen code, mit dem Sie eine stateless-Funktor und schalten Sie es in einen Funktionszeiger:
wo die
template
Funktionas_function_ptr
nimmt die Art des Staatenlosen Funktor und schafft ein wegwerfen Art, mit der Sie warf es auf jedem kompatiblen Funktion Zeiger Typ.Dieser hat bescheiden weniger Aufwand als die
std::function
Lösung, als ein Aufruf über einen Funktionszeiger, neigt dazu schneller zu sein als über einevirtual
Methode, und darüber hinaus einige Compiler (z.B. gcc) sind ganz anständig bei inlining-Funktion Zeiger, sogar von einer compilation unit zur anderen.Als bonus, in C++14, die Sie nutzen könnten:
und es funktioniert immer noch ziemlich optimal.
Verwenden Sie eine Vorlage: