int (*EXTENSIONFUNCTION)(NATIVEVALUE args[]);
Es ist möglich, eine EXTENSIONFUNCTION zu registrieren und die Anzahl der Argumente, die es braucht.
Meine Idee war, dass ich eine Klasse Extension
machen würde, um eine Erweiterung abzuschließen. Es könnte in der Lage sein, aus einer std :: function (oder jeder Callable, idealerweise, aber lassen Sie uns einfach sagen, es enthält eine std :: -Funktion für jetzt) . Und die Erweiterung nimmt Value-Parameter, die NATIVEVALUE (aber sind größer). Ich würde zum Beispiel automatisch die Anzahl der Parameter mit sizeof...(Ts)
überwachen. Es könnte wie folgt aussehen:
Extension<lib::Integer, lib::String> foo =
[](lib::Integer i, lib::String s) -> int {
std::cout << i;
std::cout << s;
return 0;
}
Problem ist, dass für die C-Bibliothek, um sie zu registrieren und rufen, sie will, dass die Array-basierte Schnittstelle. : -/
Ich machte mich daran, den Compiler zu versuchen, ein kleines Shim zu schreiben, aber ich sehe keinen Weg, es zu tun. Ich kann eine variadic operator()
auf Erweiterung haben, und eine Laufzeitschleife über den NATIVEVALUE, um ein Array von Value [] zu erhalten. Aber was mache ich damit? Ich kann die std :: -Funktion damit nicht aufrufen.
So scheint es, ich muss eine EXTENSIONFUNCTION-Instanz machen, die meine std :: -Funktion aufruft, als Mitglied jeder Extension-Instanz.
Aber im Grunde finde ich mich gegen eine Wand, wo ich eine variadic gestempelte Klasse für die Erweiterung habe ... und dann eine Art von "kann nicht von hier kommen" in Bezug auf diese NATIVEVALUE args[]
und in der Lage zu sein Rufen Sie die std :: -Funktion mit ihnen auf. Wenn std :: function bereit wäre, mit einem std :: -Array von Argumenten aufgerufen zu werden, würde das das Problem lösen, aber so funktioniert es natürlich nicht.
Ist es möglich, eine Scheibe dieses Typs zu bauen? Das „hässlich“, was ich tun kann, ist nur Proxy auf einem anderen Array, wie:
Extension<2> foo =
[](lib::Value args[]) -> int {
lib::Integer i (args[0]);
lib::String s (args[1]);
std::cout << i;
std::cout << s;
return 0;
}
Aber das ist nicht so ergonomisch. Es scheint unmöglich zu sein, ohne die Aufrufkonvention zu kennen und eine Art Inline-Assembly zu machen, um die Parameter zu verarbeiten und die Funktion aufzurufen (und sogar das würde nur für Funktionen funktionieren, nicht Callables im Allgemeinen). Aber die Leute hier haben, bevor das Unmögliche möglich erwiesen, in der Regel im Wege der „das ist nicht das, was Sie wollen, was Sie wirklich wollen, ist ...“
UPDATE: Ich fand gerade diese, die scheint viel versprechend ... ich versuche immer noch ihre Relevanz zu verdauen:
"unpacking" a tuple to call a matching function pointer
(Anmerkung: Es gibt ein paar Querschnittsthemen in dem, was ich tun wollen ist ein weiterer Punkt Folgerung aus lambdas eingeben.. Antwort hier scheint die beste zu sein wettet, dass ... es scheint zu funktionieren, aber ich weiß nicht, ob es „koscher“ ist: Initialize class containing a std::function with a lambda)
Da 'EXTENSIONFUNCTION' anscheinend keine' void * userData' benötigt, um Ihre Klasse 'Extension' aufrufen zu können, sehe ich nicht, wie Sie Ihr Problem lösen können. – Jarod42
Was ist 'NATIVEVALUE'? Vielleicht können Sie im ersten Element des Arrays einen Zeiger auf 'Extension' übergeben. –
Ich hatte eine etwas schwierige Zeit zu lesen, was Sie hier reingelegt haben, aber ich * denke * vielleicht ist es [so etwas] (http://ideone.com/fJlkK6). Wenn nicht, hoffe ich, dass es dir wenigstens ein paar Ideen gibt. Viel Glück. – WhozCraig