Ich muss einen modularen Serialisierer erstellen. Ich benutze msgpack.Vorlage Parameter Pack Serialisierung
So ist eine einfache Form ist wie folgt aufgebaut:
enum class FieldId
{
Time,
Pressure
};
struct TimeFieldConfig
{
typedef long long DataType;
const static FieldId id = FieldId::Time;
}
struct PressureFieldConfig
{
typedef double DataType;
const static FieldId id = FieldId::Pressure;
}
struct BaseField
{
virtual void dump(std::ofstream &buffer) const = 0;
};
template<class T>
struct Field : BaseField
{
void dump(std::ofstream &buffer)
{
msgpack::pack(buffer, values);
}
std::vector<typename T::DataType> values;
}
struct Recorder
{
template <class T>
void insertField()
{
data.insert_or_assign(T::id, new Field<T>);
}
template <class T>
void add(const typename T::DataType &v)
{
if (data.find(T::id) != data.cend())
reinterpret_cast<Field<T> *>(data[T::id])->add(v);
}
void dump(const std::string fpath)
{
std::ofstream outFile;
outFile.open(fpath, std::ios::binary);
// headers
std::vector<int> keys;
for (const auto &k : data)
keys.push_back(static_cast<int>(k.first));
msgpack::pack(outFile, keys);
// values
for (const auto &k : data)
k.second->dump(outFile);
outFile.close();
}
std::map<FieldId, BaseField *> data;
}
int main(int arc, char* argv[])
{
Recorder r;
r.insertField<TimeFieldConfig>();
r.insertField<PressureFieldConfig>();
/* add data ... */
r.dump("data.dat");
}
Dump funktioniert gut, alle Daten und Header vorhanden sind. Jetzt möchte ich aufgenommene Daten zurückladen.
Meine Frage ist, wie erstelle ich eine Instanz meiner Recorder
die Felder dynamisch einfügen benötigt?
Dies ist zu breit - was hast du schon versucht? Wo bist du stecken geblieben? –