S
@Th69 sagte in C func-ptr to C++ std::function:
Das habe ich mir gedacht, daß jetzt diese Frage kommt.
Antwort: Mittels "Compilermagie"!
So viel ich weiß (bzw. mal gelesen habe), erzeugt der C#-Compiler eine eigene Datenstruktur mit einem Zeiger (IntPtr) auf eine aus der Memberfunktion erzeugten neuen Funktion, wo die Zugriffe auf die Membervariablen dann auf diese Datenstruktur umgebogen sind. Und vor dem Aufruf werden dann diese Variablen aus den Membervariablen kopiert und nach dem Aufruf wieder zurückkopiert (Marshalling).
Gefunden habe ich dazu nur noch Proposal: C# should provide better interop with unmanaged function pointers (von 2017), wo es darum ging, daß C# direkt C-Funktionzeiger unterstützen soll (ohne Marshalling), was auch jetzt seit C# 9 (C# - Function Pointers for High-Performance Scenarios ) möglich ist.
Das ist der Vorteil von Sprachen mit Reflection bzw. dynamischer Codererzeugung (wobei ich nicht genau weiß, ob dies direkt beim Compilieren oder aber einmalig zur Laufzeit erzeugt wird).
Dies ginge sicherlich auch mit C++, aber bisher unterscheidet C++ eben streng zwischen Funktionszeigern (R ()(...)) und Memberfunktionszeigern (R (C::)(...)).
Dafür bräuchte man wohl dann ein eigenes Schlüsselwort - und außerdem setzt C++ (wie C) auf hohe Performance. std::function<...> ist dabei ein Kompromiss um einen Datentyp zu haben, welcher beides unterstützt - aber eben keine Konvertierung ermöglicht.
Wenn du es bei C# mal genauer wissen willst, dann könntest du einen C# Compiler wie SharpLab benutzen und dir den generierten Code bzw. IL-Code anschauen.
erstmal "Chapeau", was du so ausm stehgreif weißt;)
zum glück habe ich die c- codebase in der hand.. ich werde jetzt dem callback ein "context/tag" void* mit geben.
lib_register(this,callback)
dann geht das auch so;)