Das ist ziemlich weit hergeholt, da ich mir nicht sicher bin, ob das möglich ist, aber vielleicht wird jemand, der erfahrener als ich in der Template-Metaprogrammierung ist, mich aufklären.
Ich schreibe ein automatisiertes Lua-Funktions-Binding-System mit Hilfe von Templates, wobei ich den Funktionstyp mit partieller Spezialisierung extrahiere:
%Vor%Problem ist, das sagt mir nicht die Funktion Aufruf Konvention, so (in VS2012 32 Bits) wird nicht für __stdcall kompilieren, und es wird mit __fastcall abstürzen. Ich kann eine andere spezialisierte Version erstellen, um mit einer bestimmten Aufrufkonvention umzugehen, zB:
%Vor%Aber die Anzahl der Permutationen beginnt außer Kontrolle zu geraten: 2 (globale & amp; Mitgliedsfunktionen) mal maximale Anzahl der Parameter mal Anzahl der Aufrufkonventionen.
Ich frage mich also, ob es eine Möglichkeit gibt, die Aufrufkonvention als Template-Parameter zu bekommen (wahrscheinlich nicht, weil es nicht wirklich ein Typ ist), um die Menge an Copypasting zu reduzieren.
Wenn Sie mit diesem Parametertyp arbeiten, können Sie Folgendes tun:
Fügen Sie einen zusätzlichen Parameter hinzu
Ihre Vorlage sieht dann so aus:
template < typename T, T function, typename CallType > class Function_c;
Sie können die tatsächliche Verteilung innerhalb von CallType
leicht verbergen. Daher müssen Sie nur eine Klasse für jeden Aufruftyp implementieren.
Erstellen Sie einen Wrapper
Ich vermute, dass Ihre Klasse bereits ein Wrapper-Objekt ist, aber Sie können leicht einen Schritt weiter gehen.
Sie können für jeden der Anruftypen einen Wrapper erstellen und dann die Vorlage in
ändern template < typename T, typename Functor > class Function_c;
Instanciating wie folgt: Function_c<int, WrapperStdCall<int (*)()> > x;