Callable Objekte mit verschiedenen Aufrufkonventionen

8

Im Moment baue ich Funktoren (Callable Typen) für die verschiedenen Aufrufkonventionen (__stdcall, __cdecl, __fastcall etc.). Mit den Wrappern kann ich so etwas machen:

%Vor%

Im Moment habe ich einen Wrapper für die Aufrufkonvention __stdcall erstellt, der jede __stdcall-Funktion aufrufen kann, solange die richtigen Parameter angegeben sind und die richtigen Argumente übergeben werden. Die Klasse sieht so aus:

%Vor%

Mit dieser Hand entschied ich mich, die anderen Wrapper zu erstellen, aber ich dachte mir, dass das Eintippen des gleichen Codes und das Ändern der Aufrufkonvention innerhalb der using-Deklaration für callable_t mehr Arbeit als nötig ist. Also wollte ich einen Weg finden, um ungefähr 4 Varianten von aufrufbaren Typen zu erstellen (für jede Aufrufkonvention), aber ich konnte keinen Weg finden, dies zu tun.

Bisher habe ich versucht, eine Enumeration als Template-Parameter vom Typ ohne Typ zu verwenden:

%Vor%

Aber ich weiß nicht, wie ich den Typ des Call-Objekts iterieren und den erforderlichen Typ festlegen soll (ich habe versucht, std :: is_same / std :: enable_if zu verwenden, aber das war eine Sackgasse). Ich habe auch eine Template-Spezialisierung mit Code wie diesem versucht:

%Vor%

Aber ich dachte nicht an den Rest der Argumente (Rückgabetyp + Parameter), so dass dies nicht funktionieren kann.

Gibt es also irgendwelche Ideen, was ich tun kann? Eine Methode, an die ich denke, ist das Umschalten des Nicht-Typparameters und das Aufrufen des richtigen wie folgt:

%Vor%

Und obwohl es wie eine funktionierende Lösung aussah, habe ich mich gefragt, ob es gute Alternativen gibt, an die ich nicht denke.

Irgendwelche Ideen?

    
Michael Kiros 29.12.2015, 00:26
quelle

2 Antworten

1

Wenn Sie immer noch das Argument der aufgezählten Vorlage verwenden möchten, können Sie dies mithilfe der Spezialisierung erreichen.

%Vor%

Das ist besser als eine switch-Anweisung.

(Entschuldigung für die Kommentare zu den Vorlagenargumenten. Ich bin mir nicht ganz sicher, wie das funktioniert)

Hier ist, wo ich auf die Idee gekommen bin, was .

Hoffe, das hilft!

    
tkellehe 29.12.2015 20:22
quelle
1

Nun, sobald Sie Tags für jede Aufrufkonvention definiert haben, können Sie die Tag-Verteilung regelmäßig verwenden:

%Vor%

Sehen Sie es in Aktion: Ссылка Dies kann natürlich weiterentwickelt werden; Die Tags können eine Rebind-Variadic-Elementvorlage enthalten, die einen Funktionszeigertyp mit der entsprechenden Aufrufkonvention zurückgibt.

Ich nehme an, Sie können das Kopieren und Einfügen sogar reduzieren, indem Sie Tagdefinitionen in einem Makro sauber haben.

    
StoryTeller 31.12.2015 09:41
quelle

Tags und Links