Ich möchte Schnittstelle für die Serialisierung von Variablen zu definieren, wo abhängig von einer Vorlage Argument, Serialisierung Code ( true
) oder nichts ( false
) durchgeführt wird. Die Serialisierungsfunktion ist selbst eine Vorlage für Archiv- und Variablentypen.
Ist es besser, die Serialisierungsfunktion teilweise zu spezialisieren oder die Klasse mit der statischen Methode darin zu spezialisieren? Ist der folgende Code korrekt? Gibt es einen besseren Weg?
Dies ist mein Pseudocode, bei dem ich mir nicht sicher bin, ob er funktionieren würde oder nicht.
Der Klassenansatz sieht in etwa so aus:
template<bool ser>
struct MaybeSerialize;
template<> struct MaybeSerialize<true>{
template<class ArchiveT, class T>
static void serialize(ArchiveT& archive, T& var){ /* serialize*/ }
};
template<> struct MaybeSerialize<false>{
template<class ArchiveT, class T>
static void serialize(ArchiveT& archive, T& var){ /* do nothing*/ }
};
// call like this
MaybeSerialize<compileTimeBool>::serialize(archive,variable);
Die partielle Spezialisierung würde lauten (die Syntax ist wahrscheinlich falsch):
template<bool ser, class Archive T, typename T> maybeSerialize(ArchiveT&,T&);
template<class ArchiveT, typename T> maybeSerialize<true>(ArchiveT&,T&){ /* serialize */ }
template<class ArchiveT, typename T> maybeSerialize<false>(ArchiveT&,T&){ /* do nothing */ }
// call like this
maybeSerialize<compileTimeBool>(archive,variable);