2014-10-26 7 views
6
Überlastung

Dies ist der Code von WebKit:was ist die Bedeutung dieses [i] in C++ ohne

class ExecState : public Register 
{ 
JSValue calleeAsValue() const { return this[JSStack::Callee].jsValue(); } 
... 
} 

JSStack::Callee ist const wird Operator[] nicht

So in ExecState oder Register, Überlastung, was ist die Syntax in C++ von this[JSStack::Callee]?

+0

Haben Sie versucht, es aus dem Code zu entfernen und zu sehen, was passiert? – Chantola

+4

Uhh das ist keine gute Sache. Wenn 'JSStack :: Callee' nicht zu 0 ausgewertet wird, haben Sie große Probleme. Wenn ja, hast du wirklich immer noch Probleme. – chris

+0

Versuchen Sie das nicht zu Hause? –

Antwort

5

Nun, this ist ein Zeiger auf ExecState und die Verwendung des Subscript-Operators mit einem Zeiger bewirkt, dass es sich verhält, als wäre es ein Array. Das heißt, der Ausdruck this[JSStack::Callee] greift auf ein Objekt zu, das JSStack::Callee Elemente von this entfernt ist. Dies kann natürlich nur funktionieren, wenn das Element Mitglied eines Arrays von ExecState Objekten ist.

Unten finden Sie eine kurze eigenständige Demo zur Verwendung dieser "Funktion". Im Allgemeinen würde ich empfehlen, es zu verwenden, aber es kann sehr spezifische Bedürfnisse geben, wo es bekannt ist, dass ein Typ innerhalb eines Arrays verwendet wird und die Zugriffe machbar sind. Wenn der Typ beispielsweise lokal definiert ist, könnten alle bekannten Verwendungen bekannt sein (ich würde jedoch einen Kommentar hinzufügen, der diese Annahme angibt).

#include <iostream> 

class foo { 
    int d_value; 
public: 
    foo(int i): d_value(i) {} 
    int get(int i) const { return this[i].d_value; } 
}; 

template <typename T, int Size> 
int size(T(&)[Size]) { return Size; } 

int main() 
{ 
    foo f[] = { 9, 1, 8, 2, 7, 3, 6, 4, 5 }; 
    for (int i=0; i < size(f) - 2; ++i) { 
     std::cout << "f[" << i << "].get(2)=" << f[i].get(2) << '\n'; 
    } 
} 
+1

Diese Fähigkeit ist eine wirklich schwarze Magie ... –

Verwandte Themen