(Wie) ist es möglich, bind/rebind Methode zu arbeiten, mit ein Delegat, der eine andere Signatur?
Ich bin ein c++ Entwickler, die verwendeten Signale & Ablagefächer in c++, das auf mich scheint, Analog zum Delegaten in c#. Ich habe festgestellt, mich an einem Verlust bei der Suche nach den Funktionen "binden", und das Gefühl, ich muss etwas fehlen.
Ich das Gefühl, dass so etwas wie die folgenden, die möglich ist, in c++ möglich sein sollte, in c# mit den Delegaten. Hier einige psudo-code für das, was ich tun würde, in c++:
Slot<void> someCallback;
int foo(int i)
{
std::cout << "Value: " << i << "\n";
return i;
}
int main()
{
int i = 0;
Slot<int> someCallback = bind( fun_ptr(foo), i );
++i; //added to show that late evaluation would be a non-trivial difference
int result = someCallback();
assert( result == 0 );
return 0;
}
Leider habe ich nicht in der Lage gewesen zu finden, jede Bezugnahme auf die Bindung/neubindung mit Bezug auf c# - Delegaten. Bin ich etwas fehlt? Gibt es eine radikal andere Weise, dies zu tun in c#?
InformationsquelleAutor Catskul | 2010-01-20
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C# - wir tun so etwas wie dieses:
Klar die Methode
Foo
entspricht Ihre MethodeFoo
nur mit den entsprechenden AufrufeConsole.WriteLine
stattstd::cout
.Nächstes deklarieren wir eine Methode
Curry
nimmt eineAction<T>
und zurückAction
. Im Allgemeinen, eineAction<T>
ist ein Delegat, der akzeptiert einen einzelnen parameter vom TypT
und zurückvoid
. InsbesondereFoo
ist einAction<int>
weil es akzeptiert einen parameter vom Typint
und zurückvoid
. Als für den Rückgabetyp derCurry
wird deklariert alsAction
. EinAction
ist ein Delegat, der hat keine Parameter und gibtvoid
.Die definition von
Curry
ist ziemlich interessant. Wir definieren eine Aktion mit einem lambda-Ausdruck ist eine sehr spezielle form von einem anonymen Delegaten. Effektivsagt, dass die
void
parameter zugeordnet istaction
bewertetparameter
.Schließlich in
Main
wir deklarieren eine Instanz vonAction
namenscurried
das ist das Ergebnis der AnwendungCurry
zuFoo
mit dem parameter5
. Das spielt die gleiche Rolle wiebind(fun_ptr(foo), 5)
im C++ - Beispiel.Schließlich rufen wir die neu gebildeten delegieren
curried
über die syntaxcurried()
. Das ist wiesomeCallback()
in deinem Beispiel.Fancy Begriff für diese ist currying.
Als noch interessanter ist Folgendes zu berücksichtigen:
Hier sind wir deklarieren eine Methode
Curry
akzeptiert Delegierter (Func<TArg, TArg, TResult>
akzeptiert zwei Parameter des gleichen TypsTArg
und gibt einen Wert von etwas anderer ArtTResult
und einen parameter vom TypTArg
und gibt ein Delegat, der akzeptiert einen einzelnen parameter vom TypTArg
und gibt einen Wert vom TypTResult
(Func<TArg, TResult>
).Dann, als test deklarieren wir eine Methode
Add
akzeptiert zwei Parameter vom Typint
und gibt einen parameter vom Typint
(aFunc<int, int, int>
). Dann inMain
instanzieren wir eine neue Stellvertretung benanntaddFive
das wirkt wie eine Methode fügt hinzu, dass fünf seiner input-parameter. SoDrucke
12
auf der Konsole.Versuchen Sie die folgenden
Oder für etwas noch näher an das C++ Gegenstück
Erklärung. Was hier passiert ist, das ich erschaffe eine neue Stellvertretung durch einen lambda-Ausdruck. Der lambda-Ausdruck beginnend mit
() =>
. In diesem Fall erstellt er einen Delegat akzeptiert keine Argumente und produzieren keinen Wert. Es ist kompatibel mit dem TypAction
.Action<T>
ist eine Stellvertretung zur Verfügung gestellt durch das framework. Es ist eine Funktion, die einen parameter (vom Typ T) und gibt nichts zurück (void). Er ist die Zuweisung einer anonymen Funktion, die Delegierten (die er genannt hatsomeCallback
). Die leeren Klammern zeigen an, dass es keine Argumente entgegennimmt, wird der Ausdruck nach der=>
ist der Körper der Funktion.