2012-03-28 13 views
0

Ich versuche gerade, Funktionsüberladung und Funktionszeiger zu erfassen. Um ein Stück Code zu verkürzen, möchte/muss ich einen Funktionszeiger auf einen Vergleichsoperator setzen. In meinem ursprünglichen Code schliesse ich mich durch und vergleiche viele Paare von Float-Variablen. Meine Aktionen nach dem Vergleich hängen davon ab, ob eine dritte semi-statische Variable positiv oder negativ ist. In dieser Version muss ich entweder den Wert der semi-statischen Variable für jedes Paar überprüfen oder ich muss viel Code replizieren.Funktionszeiger auf Vergleichsoperator

double angleRight; //This variable is either positive or negative and is not reassigned for the purpose of this code 

while (points.size() > 2){ 
siz = points.size(); 
for (int i = 0; i < siz; i++){ 
    if (angleRight > 0 && points[i].angle < 0){ 
<Do something> 
    <remove points[i]> 
    } else if (angleRight < 0 && points[i].angle > 0){ 
    <Do something else> 
     <remove points[i]> 
    } 
} 

Wenn ich stattdessen angleRight einmal auswerten kann und dann einen Funktion-Zeiger speichern, um entweder Operator> oder Betreiber <, würde ich in der Lage sein, diese Funktion-Zeiger stattdessen zu verwenden und sowie die gesamten Auswertung angleRight vermeiden kann, 'sonst'-Block. Ich habe versucht, Funktionszeiger zu verstehen und (ich denke) ich sehe, wie ich es geschafft hätte, wenn ich Zugriff auf eine überladene Member-Funktion haben wollte.

//This compiles 
class Bs{ 
    public: 
    float x; 
    bool operator< (Bs y){ 
    return x < y.x; 
    } 
}; 
bool (Bs::*compare) (Bs) /*const*/ = &Bs::operator<; 

Aber was ich wirklich tun wollen/vorstellen, ist so etwas wie dieses:

//This does not compile: 
bool (*compar) (float) /*const*/ = &float::operator<; 

EDIT: machen die beiden Funktionen ‚größer‘ und ‚weniger‘ ist, was ich will:

bool greater(float x, float y){ 
    return x > y; 
} 
bool less(float x, float y){ 
    return x < y; 
} 

bool (*compar) (float, float) = (angleRight < 0)? &greater : &less; 

Aber es ärgert mich, dass ich eigentlich die Funktionen schreiben muss. Gibt es keinen direkten Zugriff auf den Float-Operator>?

+0

Was ist das ultimative Ziel dieser Frage? Liegt es daran, dass Sie "sowohl Funktionsüberladung als auch Funktionszeiger erfassen wollen", oder möchten Sie die Routine tatsächlich effizienter gestalten? –

+0

Beide. Ich schreibe Code, um besser (schöner oder effektiver) C++ - Code zu lernen. Ich versuche meinen Code zu verbessern, aber es ist ebenso wichtig, dass ich die Sprache "tiefer verstehe". Einen Zeiger auf eine Funktion zu verwenden, wäre mir sowohl hübsch als auch effektiv erschienen. – clearfix

Antwort

1

Die C++ - Möglichkeit, solche Dinge zu tun, besteht nicht darin, einen Funktionszeiger zu akzeptieren, sondern durch die Annahme eines funktionsähnlichen Objekts .

Ein Beispiel:

template <class T, class Cmp> int cmp(T x, T y, Cmp cmp_func = std::less) { 
    return cmp_func(x, y) - cmp_func(y, x); 
} 

In diesem Beispiel haben wir nicht genau das ist es egal, was Cmp ist, solange es operator() mit zwei Operanden unterstützt.

Wenn Ihre Funktion ein funktionsähnliches Objekt akzeptiert, können Sie Standardobjekte wie std::less diese Frage automatisch lösen.

+0

Die zwei Funktionen "größer" und "weniger" machen, was ich will, aber es ärgert mich, dass ich die Funktionen schreiben muss. Gibt es keinen direkten Zugriff auf den Float-Operator>? – clearfix