2016-04-05 6 views
1

Ich habe eine Funktion, die ein Objekt einer benutzerdefinierten Klasse übernimmt. Ein Member dieses Objekts sollte eine Kennung dieser Funktion (oder eine 'Referenz' zu dieser Funktion) speichern, damit die Funktion feststellen kann, ob sie zuvor mit diesem Objekt aufgerufen wurde.Wie bekomme ich eine eindeutige Kennung einer Funktion

Was ist ein geeigneter Identifizierer für diesen Zweck?
Ich spreche nicht unbedingt über den Funktionsnamen, weil überladene Funktionen den gleichen Namen haben, also funktioniert das nicht.
Ist die Funktionsadresse (wie für Delegierte verwendet) ein richtiger Weg? Ich bin mir ziemlich sicher, dass das funktionieren wird, aber nicht 100% sicher. Oder kann die Funktion wie gewöhnliche Objekte vom Garbage Collector verschoben werden?
Gibt es vielleicht eine andere, bessere Möglichkeit, eine 'Funktions-ID' zu erhalten?

bearbeiten
Hier ist ein Beispiel meine Anforderung (Pseudo-Code verwendet wird) zu demonstrieren:

void WorkerFunction (CFuncStep i_oFS) 
{ 
    if (i_oFS.FunctionID == WorkerFunction.FunctionID) 
    { 
    // continue work 
    } 
    else 
    { 
    // start work 
    i_oFS.FunctionID = WorkerFunction.FunctionID; 
    } 

    if (finished_work) 
    i_oFS.FunctionID = null; 
} 

Der Zweck ist das Speichern des Betriebszustands und später eine Operation in einer aufgerufenen Funktion fort. Dies macht in Fällen, z.B. wo die Funktion Netzwerkkommunikation durchführt und auf die Antwort warten muss. Die Funktion kehrt sofort zurück, so dass der Thread andere Arbeiten ausführen kann. Später kommt es zurück, um die Antwort zu holen.
Ich könnte einen separaten Thread verwenden, aber ich möchte den Overhead der Thread-Synchronisierung hier vermeiden, weil es nicht nur 1 add sein würde. Thread, aber ziemlich viele.

+0

Ohne etwas mehr Kontext ist es schwer, die beste Art und Weise zu sagen, dies zu tun, aber in den meisten Fällen würde ich vorschlagen, nicht zu erlauben Sie einem Mitglied einer Klasse, auf diese Weise andere Kenntnisse über Funktionen zu haben. Zu welchem ​​Zweck müssen Funktionen wissen, ob sie schon einmal für dieses Objekt aufgerufen wurden? –

+0

Auf der Suche nach einem Orakel ist eher eine schlechte Idee. Verwenden Sie stattdessen ein Enum. –

+0

Das MethodHandle sollte Ihre Anforderungen erfüllen –

Antwort

0

@BenVoigt: Danke für den Hinweis auf MethodHandle!
Das ist absolut was ich brauchte. Ich fand ein Anwendungsbeispiel an der SO Post ‚Can you use reflection to find the name of the currently executing method?

Hier ist meine Lösung:

using namespace System::Reflection; 

ref class CFuncStep 
{ 
public: 
    int    m_iStep; 
    MethodBase^  m_oMethod; 
    String^   m_sName; 
}; 

void workerfunction (CFuncStep^ i_oFS) 
{ 
    MethodBase^ oMethod = MethodBase::GetCurrentMethod(); 

    if (oMethod != i_oFS->m_oMethod) 
    { 
    i_oFS->m_iStep = 1; 
    i_oFS->m_oMethod = MethodBase::GetCurrentMethod(); 
    i_oFS->m_sName = i_oFS->m_oMethod->Name; 
    } 

    switch (i_oFS->m_iStep) 
    { 
    case 1: 
    case 2: 
    case 3: 
    i_oFS->m_iStep++; 
    break; 

    case 4: 
    i_oFS->m_iStep = 0; 
    i_oFS->m_oMethod = nullptr; 
    i_oFS->m_sName = nullptr; 
    } 
}; 

int main() 
{ 
    CFuncStep^ oFS = gcnew CFuncStep; 
    do 
    { 
    workerfunction (oFS); 
    } 
    while (oFS->m_iStep > 0); 

    return 0; 
} 
Verwandte Themen