ich viele Wrapper mit C-Bindung des Formulars generieren müssen:ein C Symbol Alias ein C++ erstellen Template-Funktion
int myfunc (type0 param0, type1 param1, ..., typeN paramN) {
return (*g_libc.myfunC## _fn) (param0, etc...)
}
Bisher habe ich mit vielen Makros entfernt:
#define NATIVE(name,...) \
auto name (FULL_ARGS(__VA_ARGS__)) \
{ \
return (*mystruct.name ## _fn) (ARGS (__VA_ARGS__)); \
}
aber ich möchte variadic Vorlagen in C++ 11 aus verschiedenen Gründen verwenden. Ich habe eine Arbeits variadische Funktion, die die vorherige hackish Implementierung ersetzen könnte:
#define NATIVE(name) template <typename... Args> \
auto name (Args&&... args) -> decltype(name (std::forward<Args>(args)...)) \
{ \
return g_libc. name ## _fn (std::forward<Args>(args)...); \
}
aber dann würde ich die C-Bindung verlieren (da Vorlagen können nicht C-Bindung haben). Meine Idee ist also, einen Alias mit dem gewünschten Funktionsnamen zu erstellen, der auf die Template-Funktion zeigt. Es scheint möglich, ein C-Symbol als Alias einer C++ - Funktion zu haben (mag offensichtlich erscheinen, aber ich musste es testen und es hat gut funktioniert). Um jedoch die Template-Funktion aliasieren zu können, muss ich den Namen des Mangels zur Kompilierungszeit kennen, was schwierig zu sein scheint (keine Gcc-Erweiterung, obwohl ich auch Clam unterstützen möchte). Meine Schlussfolgerung ist, dass ich den Alias als Nachbearbeitungsschritt hinzufügen sollte.
Also die Frage ist, wie man ein Symbol Alias zu einer bereits gebauten Shared Library hinzufügen?
Mit freundlichen Grüßen (ich kann ‚grep‘ die ‚nm‘ Ausgang des verstümmelten Symbol abrufen)
Die Funktionsvorlage ist keine Funktion, sie hat nicht selbst einen Namen, mit dem ein anderes Modul verknüpft werden kann. Funktionsschablonen-Instanziierungen mit konkreten Vorlagenargumenten sind Funktionen. Ich denke nicht, dass Vorlagen bei Ihrer Suche hilfreich wären. Ihr ursprüngliches Beispiel, das keine Vorlagen verwendet, macht viel mehr Sinn. –
Danke für die Korrektur. Die Motivation für die Verwendung von Templates ist sehr spezifisch für das Projekt, das ich zu aktualisieren versuche: Das Projekt generiert eine Art gefälschte libc. Wenn ich die Makroversion verwende, muss ich explizit die Argumente "NATIVE (name, ...)" setzen, während die Vorlage die Argumenttypen nur vom Funktionsnamen ableiten kann, da die Funktionen bereits im Standardheader deklariert sind. Normalerweise möchte ich "NATIVE (printf)" anstelle von "NATIVE (printf, const char *, ...)" schreiben können. – mattator
Nein, eine Vorlage kann Argumenttypen aus der Funktion ** call ** ableiten, nicht der Funktionsname allein. Was dir nicht weiterhilft, da der Aufruf anscheinend in irgendeinem C-Modul liegt, das natürlich nichts über Templates wissen würde. –