Wie spezialisiere ich eine Funktionsvorlage, die einen universellen Referenzparameter verwendet?
foo.hpp:
%Vor%foo.cpp
%Vor% Hier ist Class
nicht länger ein abgeleiteter Typ und somit Class
genau; Es kann unmöglich sein, Class &
zu verwenden, daher helfen mir die Regeln zum Einklappen von Referenzen nicht weiter. Ich könnte vielleicht eine weitere Spezialisierung erstellen, die einen Class &
-Parameter benötigt (ich bin mir nicht sicher), aber das bedeutet, dass du den gesamten Code in foo
für jede mögliche Kombination von rvalue / lvalue-Referenzen für alle Parameter duplizierst universelle Referenzen sollen vermeiden.
Gibt es einen Weg, dies zu erreichen?
Genauer gesagt zu meinem Problem, falls es einen besseren Weg gibt, es zu lösen:
Ich habe ein Programm, das sich mit mehreren Spielservern verbinden kann, und jeder Server ruft zum größten Teil alles mit dem gleichen Namen an. Allerdings haben sie für einige Dinge leicht unterschiedliche Versionen. Es gibt ein paar verschiedene Kategorien, in denen diese Dinge sein können: eine Bewegung, ein Gegenstand usw. Ich habe eine generische Art von "Move String to Move Enum" -Satz von Funktionen geschrieben, um internen Code aufzurufen, und mein Server-Interface-Code ist ähnlich Funktionen. Einige Server verfügen jedoch über ihre eigene interne ID, mit der sie kommunizieren, einige verwenden Zeichenfolgen und andere verwenden beide in unterschiedlichen Situationen.
Nun, was ich tun möchte, ist das etwas generischer zu machen.
Ich möchte etwas wie ServerNamespace::server_cast<Destination>(source)
aufrufen können. Dadurch könnte ich von Move
auf std::string
oder ServerMoveID
umwandeln. Intern muss ich möglicherweise eine Kopie erstellen (oder verschieben), da einige Server erfordern, dass ich eine Historie der gesendeten Nachrichten aufbewahre. Universelle Referenzen scheinen die offensichtliche Lösung für dieses Problem zu sein.
Die Header-Datei, an die ich gerade denke, würde dies einfach aufdecken:
%Vor%Und die Implementierungsdatei würde alle legalen Konvertierungen als Vorlagenspezialisierungen definieren.
Am meisten erweiterbar ist das Erstellen einer Template-Klassenspezialisierung.
%Vor%Der Grund, warum ich dies sage, ist der am meisten erweiterbare, weil Sie eine Spezialisierung überall hinzufügen können, innerhalb oder außerhalb der Datei, die Whatever definiert.
Dies ist nicht exklusiv für die von Pubby vorgeschlagene Tagversandlösung.
Tags und Links c++ c++11 templates template-specialization universal-reference