2016-07-20 15 views
1

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)

+0

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. –

+1

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

+1

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. –

Antwort

2

Das Makro sollte mit C-Bindung eine andere Art von verstümmelten Funktionsnamen erstellen, die die C++ Funktion aufruft. Wenn Sie es inline machen, werden die Leistungsprobleme beseitigt.

+0

Ich denke nicht, dass das machbar ist, da mein Ziel ist, die Makros loszuwerden, und ich sehe nicht, wie diese neue Zwischenfunktion die Parameter an die C++ - Funktion ohne die Makros übergeben könnte. Lassen Sie mich wissen, ob das Ziel nicht klar ist. Vielen Dank für Ihre Zeit – mattator