2009-06-14 16 views
3

Dies ist vergleichbar mit einer anderen Frage, die ich gefragt habe, aber ich habe einen Ausdruck Klasse geschaffen, die wie so funktioniert:Können Operatoren als Funktionen verwendet werden? (C++)

expression<int, int> exp(10, 11, GreaterThan); 
//expression<typename T, typename U> exp(T val1, U val2, oper op); 
//where oper is a pointer to bool function(T, U) 

wo GreaterThan ist eine zuvor definierte Funktion. Und ich frage mich, warum kann ich dies nicht tun:

expression<int, int> exp(10, 11, >); 

particularily wenn> als

Überlastung
bool operator>(int a, int a){return (a > b);} 

, die GreaterThan identisch ist:

bool GreaterThan(int a, int b){return (a > b);} 

eine Funktion, die Bool zurückgibt und nimmt zwei Argumente.

Antwort

6

Statt:

expression<int, int> exp(10, 11, >); 

Sie dies tun könnte:

expression<int, int> exp(10, 11, operator>); 

Sie könnte, weil es funktioniert nicht für ganze Zahlen. Aber es wird für andere Typen oder Operatoren funktionieren, die Sie überladen werden.

Die Operatoren, die Sie überladen, sind normale Funktionen, also spielen Sie tatsächlich mit Funktionszeigern.

3

Sie können nicht die folgenden geschrieben haben:

bool operator>(int a, int a){return (a > b);} 

C++ erlaubt es nicht, von Operatoren für die eingebauten Typen zu überlasten. Bitte schreiben Sie Ihre Frage neu und geben Sie insbesondere den eigentlichen Code für die Ausdrucksvorlage an.

2

Neil hat recht, das würde für eingebaute Typen nicht funktionieren. Mindestens einer der Parameter muss "formaler Klassentyp" sein. Ein anderes Problem ist, dass

expression<int, int> exp(10, 11, >); 

ist nicht, was Compiler Sie gerne zu schreiben mag. Stattdessen können Sie so etwas wie den folgenden Code

class A 
{ 

}; 
class B 
{ 

}; 
typedef bool (*oper)(A& a, B& b); 
bool operator>(A& a, B& b) 
{ 
    return false; 

} 
bool func(A&a, B& b, oper op) 
{ 

} 

und dann in Ihrem Code

A a; 
    B b; 
    func(a, b, operator>); 
9

Ich bin nicht sicher verwenden, wenn dies ist, was Sie fordern, aber die C++ Standardbibliothek bietet Funktionsobjekte für viele C++ Operatoren, die in der Kopfzeile <functional> deklariert sind. Dazu gehört std::plus (+), std::minus (-), std::multiplies (*), std::divides (/), std::modulus (%), std::negate (einstellige -), std::equal_to (==), std::not_equal_to (! =), std::less (<), std::greater (>), std::less_equal (< =), std::greater_equal (> =), std::logical_and (& &), std::logical_or (||), std::logical_not (!)

Vielleicht möchten Sie gerade

expression<int, int> exp(10, 11, std::greater<int>()); 
-1

Der Operator + zum Beispiel vom Typ

int (__thiscall Integer::*)(int value) 

für die Bedienfunktion

int Integer::operator + (int i) 

Sie einfach den Operator-Funktion übergeben tun Sie dies:

Integer a(10), b(20); 
add(a, b, &Integer::operator +); 

Um es machen zu verwenden:

(a.*functionPtr)(b); 
+1

Was diese magische ist 'Integer' Typ Sie sprechen? – GManNickG

+0

Nur eine Beispielklasse, die nicht mit der Verwendung von Operatorüberladungen zusammenhing. –

Verwandte Themen