0
모듈 식 시리얼 라이저를 만들어야합니다. 나는 msgpack을 사용하고있다.템플릿 매개 변수 팩 serialization
그래서, 간단한 양식은 다음과 같이 내장되어 있습니다 :
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");
}
덤프가 잘 작동, 모든 데이터와 헤더가 존재한다. 이제 녹음 된 데이터를 다시로드하고 싶습니다.
제 질문은 동적으로 필요한 필드를 삽입하는 Recorder
의 인스턴스를 어떻게 만듭니 까?
너무 광범위합니다. 이미 시도한 바가 있습니까? 어디서 붙어 있었 니? –