2009-09-07 18 views
8

Ist es möglich, C++ - Klassenoperatoren im statischen Kontext zu überladen? z.B.C++ statischer Operator überladen

class Class_1{ ... } 
int main() 
{ 

    Class_1[val]... 

} 
+0

Sollte 'Class_1 [val]' Ausbeute ein Art? Wie erwarten Sie 'Class_1 [val] v;'? –

+1

Ich wollte es integrale Werte haben, aber Typen sind in Ordnung. – jameszhao00

+0

In C++ können Typen nicht im Typsystem dargestellt werden (es gibt nur 'std :: type_id') und ich kann mir keinen Operator vorstellen, der statisch überladen werden kann. Ich schlage vor, anstatt zu fragen, ob Ihre Implementierungsidee in C++ durchführbar ist, präsentieren Sie das eigentliche Problem, das gelöst werden sollte. Jemand könnte möglicherweise eine durchführbare Implementierung vorschlagen. – sbi

Antwort

13

Wenn Sie nach Metaprogrammierung mit dem integrierten Operator suchen: So etwas ist nicht möglich - die integrierten Operatoren arbeiten mit Laufzeitwerten, nicht mit Kompilierzeitwerten.

Sie boost::mpl dafür verwenden kann, und stattdessen die integrierten Operatoren zu verwenden, seine Vorlagen verwenden, wie at für op[], plus<a, b> für op+ usw.

int main() { 
    using boost::mpl::vector; 
    using boost::mpl::at_c; 
    using boost::mpl::plus; 
    using boost::mpl::int_; 

    typedef vector<int, bool, char, float> Class_1; 
    typedef vector< int_<1>, int_<2> > Numeric_1; 

    at_c<Class_1, 0>::type six = 6; 
    typedef plus<at_c<Numeric_1, 0>::type 
       ,at_c<Numeric_1, 1>::type>::type r; 
    int i3[r::value] = { 4, 5, 6 }; 
    return ((i3[0] + i3[1] + i3[2]) * six) == 90; 
} 
3

Wenn Sie der Betreiber arbeitet mit einer Klasse bedeuten, das Nein, das nicht sinnvoll ist, ist es wie wenn man sagt operator + kann Operator auf int oder double. Operatoren sind syntaktische Zucker für Funktionen und sie arbeiten auf Variablen (Werte) und nicht auf Typen.

+1

Es macht Sinn, wenn Sie eine Art Utility-Klasse haben - mit nur statischen Membern - die etwas auf "sich selbst" lädt, auf die Sie dann am einfachsten zugreifen möchten - mit dem Operator wie '[]'. –

+1

Ja, zu @ jave.webs Kommentar hinzufügen: es kann sicherlich in Fällen sinnvoll sein * wenn Daten im statischen Bereich * der Klasse sind. (Das OP erwähnt auch den statischen Bereich explizit.) Also nicht mit einfachen Arithmetik, wie in Ihrem Beispiel, aber Sachen wie [],(), <<, >> etc. könnten auch perfekte syntaktische Zucker für jede Art von komplexen Manager-Klassen sein , ohne eine Singleton-Instanz zu erzwingen. –

5

Ich glaube nicht, dass es möglich ist, obwohl ich an dieser Front falsch liegen könnte. Ich würde gerne fragen, warum Sie das tun sollten. Anstatt Operationen für eine Klasse anstelle von Instanzen auszuführen, benötigen Sie vielleicht nur eine Instanz in Ihrer gesamten Anwendung? In diesem Fall sollten Sie wahrscheinlich the singleton pattern verwenden.

+1

Ich habe das Singleton-Muster wie verrückt benutzt, aber dann aufgehört, weil Singleton-Code so mühsam ist, Tests zu schreiben. – jameszhao00

1

Nein, Operatoren können keine statischen Member einer Klasse sein. Verwenden Sie stattdessen eine normale statische Funktion.